這裏執行對於給定的例子:藍鳥公司承諾:動態創建對象的道具,但在平行
https://github.com/petkaantonov/bluebird/blob/master/API.md#props---promise
Promise.props({
pictures: getPictures(),
comments: getComments(),
tweets: getTweets()
}).then(function(result) {
console.log(result.tweets, result.pictures, result.comments);
});
現在,如果我想建立道具動態對象?像
var propObj = {};
if (cond1) {
propObj.tweets = getTweets();
}
if (cond2) {
propObj.pictures = getPictures();
}
if (cond3) {
propObj.comments = getComments();
}
Promise.props(propObj)
.then(function(result) {
console.log(result);
});
上面的代碼將無法正常工作。 getTweets,getPictures,getComments函數會在propsObj的構建過程中執行。
但是,我實際上在尋找的是在Promises.props(propObj)
階段並行執行這些函數,然後返回結果對象。有沒有辦法做到這一點?
它們在'Promises.props(propObj)'之前執行時出現了什麼問題?他們都回復承諾,並將在排隊和技術上平行運行。在「承諾」中進行分配時。道具(propObj)'行,它們在構建對象時順序執行(返回承諾)。 'Promises.props(propObj)'只是在調用'.then()'之前等待'propObj'中的所有屬性完成。 – Steven10172
您的示例與Bluebird代碼示例的工作方式相同。在Bluebird的例子中,函數'getPictures()'和'getComments()'和'getTweets()'被稱爲BEFORE'Promise.props()'實際上被調用 - 就像你的代碼示例中一樣。傳遞給'Promise.props()'的是一個對象,prograrties是承諾。初始功能已經被調用,生成了承諾,操作已經開始。您的代碼與Bluebird示例的工作方式不同。不知道你想要解決什麼問題。 – jfriend00
你當然知道,如果你的函數實際上只是同步函數調用,那麼在普通的Javascript中並不存在對同步函數調用的並行操作,因爲這裏的主線程是單線程的。一次只能執行一件事。如果操作是異步的(例如,網絡或異步文件I/O),那麼在調用啓動之後,您會得到一些實際的並行操作,因爲本機代碼庫在初始調用返回後正在處理其他線程中的內容),但那不行發生常規的同步函數調用。 – jfriend00