2015-08-22 32 views
0

這裏執行對於給定的例子:藍鳥公司承諾:動態創建對象的道具,但在平行

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)階段並行執行這些函數,然後返回結果對象。有沒有辦法做到這一點?

+0

它們在'Promises.props(propObj)'之前執行時出現了什麼問題?他們都回復承諾,並將在排隊和技術上平行運行。在「承諾」中進行分配時。道具(propObj)'行,它們在構建對象時順序執行(返回承諾)。 'Promises.props(propObj)'只是在調用'.then()'之前等待'propObj'中的所有屬性完成。 – Steven10172

+1

您的示例與Bluebird代碼示例的工作方式相同。在Bluebird的例子中,函數'getPictures()'和'getComments()'和'getTweets()'被稱爲BEFORE'Promise.props()'實際上被調用 - 就像你的代碼示例中一樣。傳遞給'Promise.props()'的是一個對象,prograrties是承諾。初始功能已經被調用,生成了承諾,操作已經開始。您的代碼與Bluebird示例的工作方式不同。不知道你想要解決什麼問題。 – jfriend00

+1

你當然知道,如果你的函數實際上只是同步函數調用,那麼在普通的Javascript中並不存在對同步函數調用的並行操作,因爲這裏的主線程是單線程的。一次只能執行一件事。如果操作是異步的(例如,網絡或異步文件I/O),那麼在調用啓動之後,您會得到一些實際的並行操作,因爲本機代碼庫在初始調用返回後正在處理其他線程中的內容),但那不行發生常規的同步函數調用。 – jfriend00

回答

1

談到我的意見爲答案也許結束這一問題...

你的例子是相同的工作,藍鳥代碼示例。在Bluebird示例中,函數getPictures()getComments()getTweets()被稱爲BEFORE Promise.props()實際上被調用 - 與您的代碼示例中相同。傳遞給Promise.props()的是一個對象,其屬性是承諾。

那麼,是什麼在這裏發生在你的榜樣和藍鳥例如既如下:

  1. if (cond1),發起getTweets()和分配所產生的承諾propObj.tweets。異步操作在後臺繼續。
  2. if (cond2),發起getPictures(),並將結果分配給propObj.pictures。異步操作在後臺繼續。
  3. if (cond3),發起getComments()並將結果分配給propObj.comments。異步操作在後臺繼續。
  4. 致電promise.props(propObj),它只是迭代propObj的屬性,然後等待調用.then()處理程序,直到找到的所有承諾都完成爲止。
  5. 最終所有異步操作都完成並調用.then()處理程序。

初始函數已被調用,生成了承諾並且操作已在運行。您的代碼與Bluebird示例的工作方式不同。不知道你想要解決什麼問題。

你當然認識到,如果你的函數實際上只是同步函數調用,那麼在普通的Javascript中不會有同步函數調用的並行操作,因爲這裏的主線程是單線程的。一次只能執行一件事。如果操作是異步的(例如,網絡或異步文件I/O),那麼在調用啓動之後,您會得到一些實際的並行操作,因爲本機代碼庫在初始調用返回後正在處理其他線程中的內容),但那不行發生常規的同步函數調用。

+0

這個問題是,他們永遠不會執行並返回承諾 – Steven10172

+0

@ Steven10172 - 答案被重寫。 – jfriend00