2014-11-04 73 views
0

我所看到的代碼看起來像這樣:拒絕再解決問答無極

var defer = Q.defer(); 
// do something, here's the callback 
if (err) { 
    defer.reject({err: err}) 
} 
defer.resolve({success: data}); 
// close callback 
return defer.promise; 

如果一個承諾先拒絕,然後再解決,看來,「拒絕」仍然存在。

當我第一次看到這種模式時,我傾向於建議將解決方案包裝在else之內,但是因爲它按原樣工作,這是可接受的模式嗎?

拒絕並解決承諾會不會有問題?

看來,如果您解決然後拒絕,解決方案仍然存在。因此,無論先發生什麼,「堅持」是什麼?

回答

1

因此,無論先發生什麼事情,「堅持」是什麼?

是的,正好。承諾的狀態一旦被解決(不論是全滿還是被拒絕)就是不可變的。所以不,在這裏不會出現問題,如果拒絕發生在第一位,承諾將被「鎖定」爲拒絕。

但是,請考慮一下其他人是否實際上並未提高您的代碼質量。較少的代碼行不一定會提高代碼的可讀性!我會說它會的,因爲如果你看到if/else會很快理解會發生什麼。如果其他人必須查看你的代碼,而且他們一開始並不知道承諾後的承諾是不可改變的呢?

Chapter 3 of "You Don't Know JS (async & performance)"是一個很好的資源來更全面地把握承諾。 Q符合的Promises A+ specification也是如此。後者更多是「客觀的真相來源」,但更難以閱讀(嗯,這是一個規範)。

+0

優秀的答案,謝謝。 – 2014-11-04 20:10:19

+0

不客氣!如果您將其標記爲已接受,會很好。 – yerforkferchips 2014-11-04 20:12:05

相關問題