2013-07-18 106 views
1

我遇到了麻煩,當文檔說它應該被拒絕時,爲什麼履行承諾。when.all()2.2.1在cujojs不拒絕如果一個被推遲拒絕

打開http://jsbin.com/orifok/5/edit然後單擊go按鈕,當它警告「失敗」時它會發出「ok」提示。

when221.all...替換爲deferred2.promise.then(stepFulfilled, stepRejected);併發生拒收。

我確實對when.js代碼進行了修改,以使when221變量成爲全局變量,而不需要依賴於require.js庫(請參閱http://pastebin.com/J8wCqjWM與原始的https://github.com/cujojs/when/blob/2.2.1/when.js比較)。

when.all()documentatation說:如果有任何的承諾被拒絕,返回的承諾,將與被拒絕的第一個應許的拒絕理由拒絕 - 見https://github.com/cujojs/when/blob/master/docs/api.md#whenall

回答

1

TL;博士:當。所有人都必須通過承諾,而不是延期,程序員需要非常小心,不要犯這樣的錯誤。

布賴恩騎士回答了這個位置:https://github.com/cujojs/when/issues/172和修改後的代碼是在這裏:http://jsbin.com/orifok/10/edit

的答案如下:

嗨,你的示例代碼傳遞延遲對象when.all。延期對象不是承諾。不幸的是,一些庫,比如jQuery,以及早期版本的when.js,將承諾和延期對象混爲一談。爲了澄清,我最近開始將延期對象簡稱爲{解析器,承諾}。您應該將promise,而不是延遲對象傳遞給when.all。

這裏是你的榜樣的修訂版,將工作像您期望:

(function(){ 
var deferred1 = when221.defer(); 
var deferred2 = when221.defer(); 

window.clickgo = function() { 
    // Pass the promise, not the deferred 
    when221.all([deferred1.promise, deferred2.promise]).then(stepFulfilled, stepRejected); 
    deferred2.reject('foooo'); 
}; 

function stepFulfilled() { 
    alert('ok'); 
} 

function stepRejected(failed) { 
    alert('failed ' + failed); 
} 

})(); 

還要注意的是,當,JS> = 2.2.0也有一個新的,重量更輕承諾創建API when.promise,我已經開始推薦when.defer。他們適合不同的情況,但我發現我大部分時間都喜歡它。

希望有幫助!