2016-01-12 67 views
0

考慮下面的代碼,我從https://stackoverflow.com/a/28250704/460084瞭解Promise.all

function getExample() { 
    var a = promiseA(…); 
    var b = a.then(function(resultA) { 
     // some processing 
     return promiseB(…); 
    }); 
    return Promise.all([a, b]).spread(function(resultA, resultB) { 
     // more processing 
     return // something using both resultA and resultB 
    }); 
} 

了,我開了https://jsfiddle.net/Lsobypup/

的想法是運行多個承諾並返回基於一些複合價值的代碼演示他們的結果。

我不明白爲什麼在上面的代碼中promiseA只運行一次?在我看來,使用Promise.all([a,b])時,它應該先評估a時運行,然後再評估b時評估它,因爲它依賴於a。但是,演示顯示這並未發生。

Promise.all有一些神奇的事情來做到這一點嗎?圍繞這種行爲的規則是什麼?

+0

'應該先運行時是evaluated':你認爲這種情況發生的時候? –

+0

這是一個答案?如果我瞭解它,我不會問 – kofifus

+0

不是。這是一個問題。你認爲它發生在'var a = promiseA()...'行嗎? –

回答

1
var b = a.then(function(resultA) { 
     // some processing 
     return promiseB(…); 
    }); 

這是鏈接的a結果,這意味着如果a處於滿足的狀態,則回調會立即被調用。您的承諾a的解決方案首先發生,因爲它在all()調用中首先遇到。一旦完成,最終價值貫穿始終。

按本MDN reference

在內部,一個承諾可以在三種狀態之一:

  • 掛起,當最終值尚未公佈。這是唯一可能轉換到其他兩個州之一的州。
  • 實現時,如果最終值變爲可用。履行價值永遠與承諾相關聯。 這可能是任何值,包括未定義的值。
  • 拒絕,如果錯誤阻止了最終值的確定。拒絕原因與該承諾永久相關。這可能是任何值,包括未定義的值,儘管它通常是一個Error對象,就像在異常處理中一樣。
+0

謝謝!你是對的',最後的價值觀貫穿整個承諾。'這是一個功能的Promise.all()? ...我仍然感到困惑,例如我更改了Promise.all([a,a])的代碼,但promiseB onFulfilled仍然被調用! (請參閱jsfiddle.net/Lsobypup/2)爲什麼? – kofifus

+0

這是一般承諾的財產。要回答你的後續問題,如果你引用上面鏈接的引用,你會看到下面這行:**「一旦你引用了一個promise,你就可以調用它的then()方法來執行一個action該值變爲可用,或發生錯誤時。「**這意味着,只要promiseA被解析,就會立即執行對'var a'的引用調用的'then()',而不管'var b'是調用。如果你看到最後一個提示框在你的提琴中,因爲你將參數改爲'[a,a]',你會看到結果只用於promiseA。 – varevarao

0

這將是巨大的使用藍鳥模塊 http://bluebirdjs.com/docs/api/promise.props.html

const Promise = require("bluebird"); 
Promise.props({ 
    pictures: getPictures(), 
    comments: getComments(), 
    tweets: getTweets() 
}) 
.then(function(result) { 
    console.log(result.tweets, result.pictures, result.comments); 
});