多くのステップがあるシナリオで「運命のピラミッド」を回避するために、Node.jsのQモジュールを使用しています。例えば:
function doTask(task, callback)
{
Q.ncall(task.step1, task)
.then(function(result1){
return Q.ncall(task.step2, task);
})
.then(function(result2){
return Q.ncall(task.step3, task);
})
.fail(callback).end();
}
基本的に、これは機能しているようです。いずれかのタスクステップでエラーがスローされた場合、それはコールバックに渡されます(ただし、node.jsの約束は初めてなので、改善を歓迎します)。ただし、タスクチェーンを早期に中止する必要がある場合は問題があります。たとえば、result1が正常に返された場合、コールバックを早期に呼び出して残りを中止したい場合がありますが、そうしようとしても失敗します...
function doTask(task, callback)
{
Q.ncall(task.step1, task)
.then(function(result1){
if(result1)
{// the rest of the task chain is unnecessary
console.log('aborting!');
callback(null, result1);
return null;
}
return Q.ncall(task.step2, task);
})
.then(function(result2){
console.log('doing step 3...');
return Q.ncall(task.step3, task);
})
.fail(callback).end();
}
この例では、両方の「中止」が表示されます。と「ステップ3を実行しています...」が印刷されます。
私はここでいくつかの基本原則を誤解しているだけだと確信しているので、助けていただければ幸いです。ありがとう!