我有這樣的設計:遞延鏈接,Node.js和受Q,所有鏈部分一個單一的ErrorHandler
var postCommand = function(req, res){
parseForm(req)
.then(checkData)
.then(findCommand)
.then(initializeCommand)
.then(saveToDb)
.then(onUploadSucceeded.bind(this, res))
.fail(onUploadFailed.bind(this, res));
}
中的那麼的有可能拒絕該方法。我希望在發生拒絕事件之後不再執行任何操作,但最後一次.fail。
我「checkData」看起來是這樣的(是啊,它的唯一的同步鏈中的一部分):
var checkData = function(args){
var deferred = q.defer();
var fields = args[0];
var files = args[1];
var file = args[1].uploadedFile0;
var secondFile = args[1].uploadedFile1;
if(file.type !== "application/javascript"){
return deferred.reject("please only upload javascript-files");
}
(...)
return deferred.resolve([fields, file]);
}
即使deferred.reject被調用時,我在「findCommand」最終沒有傳遞的參數。我是否理解這個鏈條有什麼問題?
另外的問題:這個設計是一個很好的模式?還是有其他更好的最佳做法?
你真的應該做的每'然後內響應驗證(... )'你的承諾聲明。如果迴應不包含預期的內容,那麼你打破承諾鏈。 –
但每個失敗的回調都會做同樣的事情......調用「onUploadFailed」並將錯誤傳遞給拒絕。這對我來說就像代碼複製一樣,並降低了可讀性。我想拋出一個豁免而不是拒絕,因爲q文檔說「catch」方法會捕獲上述鏈的任何錯誤。但是,這似乎有點臭 – IntegerWolf
我使用藍鳥,所以我不知道,但我認爲你應該在所有情況下返回deferred.promise。 – Keith