2013-11-25 27 views
4

爲什麼deferred.reject()調用中沒有任何一個在最後觸發.fail()處理程序?我如何觸發一個帶有嵌套promise的單個錯誤處理程序?我需要關閉封套承諾。如何使用嵌套的promise來觸發單個錯誤處理程序?

當我在d1上觸發拒絕時,它仍然會一直到達d2的分辨率/拒絕率。如果我將.fail()添加到d1的塊中,那麼它確實會發現拒絕。但這正是我試圖避免的,每個嵌套承諾的.fail()處理程序。

var Q = require('q'); 

somePromise().then(function (v1) { 

    var d1 = Q.defer(); 

    asyncFunc1(v2, function (err, v3) { 
    if (!v3) 
     d1.reject(new Error('error')); 
    else 
     d1.resolve(true); 

    return d1.promise.then(function (promise1Kept) { 
     var d2 = Q.defer(); 
     asyncFunc2(v4, function (err, v5) { 
     if (!v5) 
      d2.reject(new Error('error')); 
     else 
      d2.resolve(true); 
     }); 
     return d2.promise.then(function (promise2Kept) { 
     console.log('end of promise chain'); 
     }); 
    }); 
    }); 
}).fail(function (err) { 
    console.log('Error!'); 
    console.log(err); 
}); 
+0

當你運行這個時你會得到什麼輸出? – user568109

+0

@ user568109添加了更多詳細信息並修復了一些錯別字。 – crzrcn

+0

你能告訴你爲什麼不想要失敗嗎?有必要(this或'then')執行錯誤處理程序。沒有錯誤處理程序默認情況下。它只會達到錯誤並停止。 – user568109

回答

1

不要混合回調和承諾或使用延遲。正如你注意到的,當你需要手動完成任何事情時,很容易搞砸鏈條。

var Q = require('q'); 
var func1 = Q.denodeify(asyncFunc1); 
var func2 = Q.denodeify(asyncFunc2); 

somePromise().then(function (v1) { 
    return func1(v2); 
}).then(function (v3) { 
    if (!v3) throw new Error("error"); 

    return func2(v4); 
}).then(function (v5) { 
    if (!v5) throw new Error("error"); 

    console.log("end of promise chain"); 
}).fail(function (err) { 
    console.log('Error!'); 
    console.log(err); 
}); 
相關問題