2015-12-09 38 views
1

我明白的文體/清晰的理由,人們可能更喜歡一種方法,但我試圖瞭解,如果有任何情況下,你不能使用承諾和必須使用延期。作爲參考,我使用的是Q javascript library,但我想它會適用於任何其他庫和語言。我不相信「Deferreds很酷,因爲......」下面的解釋實際上描述了一個案例,通過一個簡單的q.Promise()調用(因此您必須使用Deferred)不可能達到同樣的效果,但我想檢查那是對的。有沒有可能使用Promise和Deferred的任何情況?

延遲僅僅是關於消除「厄運金字塔」還是更多呢?

This question很有趣,但並沒有真正解決這個問題。

回答

2

不,沒有這種情況。這是很容易證明,你可以做你想做的事與承諾的構造函數,而不是使用延遲任何顯示他們之間的轉換:

var deferred = {}; 
var p = new Q.Promise((resolve, reject){ // always runs sync 
    deferred.resolve = resolve; 
    deferred.reject = reject; 
}); 
deferred.promise = p; 

承諾構造的優點是它的扔安全的事實 ,即 - 同步投擲轉換爲拒絕,從而使您免受微妙的錯誤。

無論如何,施工應該是used only rarely。 Q也是一個非常古老的圖書館,考慮更新,更現代的東西。

+0

1.很好的回答,清楚的看到你可以在兩者之間翻譯,謝謝本傑明。 2.偉大的聯繫。我實際上在做「只有在將API轉換爲承諾時才使用延遲對象」,因爲我認爲節點MongoClient.connect沒有傳回承諾。我發現Typescript定義並不是最新的,因爲它確實如此:[「如果沒有回調傳遞,返回:Promise](http://mongodb.github.io/node-mongodb-native/2.0/api/MongoClient.html #.connect)。3. Q很老,但它似乎工作正常,得到了一些更好的建議?非常感謝:) – AJP

+1

@AJP [Bluebird](http://bluebirdjs.com/docs/why-bluebird .html) – idbehold

+0

[某人需要什麼時候創建延期?]的副本很多[](http://stackoverflow.com/questions/32853105/when-would-someone-need-to-create-a-deferred) – jfriend00

相關問題