我正在使用the Q module來嘗試避免在有很多步驟的場景中出現「厄運金字塔」的Node.js。例如:如何正確地中止一個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 promise的新手)。但是,當我需要儘早中止任務鏈時,我遇到了問題。例如,如果成功返回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步......」打印。
我確信我只是在誤解這裏的一些基本原則,所以將不勝感激任何幫助。謝謝!
一個解決方案,我發現是創建一個單獨的承諾鏈條後第一鏈條可能會斷裂。在以上示例中,與result2相關的.then語句會附加到step2的Q.ncall,而不是附加到原始的promise。然而,這裏主要的缺點是它在我看來擺脫了Q的主要好處之一:避免厄運的金字塔!它總比沒有承諾好,但我不喜歡解決方案... –