2017-09-13 19 views
-2

我從Axios AJAX庫中找到了這個例子,但是Promises.all()也是如此。Promises.all如何確保所有承諾都可用?

到目前爲止,我讀過你可以使用Promises.all()來檢查是否已經解決了一系列承諾中的所有承諾。

這真的很整齊,但如果你推動承諾並在下一個承諾被推之前解決,會發生什麼?

我猜測我的平均AJAX調用的開銷至少爲50毫秒,推送將始終發生在任何ajax請求之前,但只是說爲此授予並不真正感覺正確。

這有2級的解決方案,我能想到的:

  1. 使用計數,以保證雙方(在thise情況下)AJAX請求是
    陣列英寸

  2. 檢查存在的實際函數名稱。

如何是別人處理這個或者是大多數人只是滿足於這兩個AJAX請求的希望推前一個人可以解決的速度不夠快。

axios.all([getUserAccount(), getUserPermissions()]) 
    .then(axios.spread(function (acct, perms) { 
    // Both requests are now complete 
    })); 
+0

這是不是很清楚你問的。你是否在動態構建承諾數組?或者你想知道這些請求是否可以在包裝之前完成? – Nit

+0

是的,這些承諾正從多個地方推出。比方說,一個單一的承諾一直在推動,而我期望2個承諾,那麼在理論上這個承諾可能在第二個承諾被推之前觸發一個承諾?如果是這種情況,那麼需要有一種機制來事先檢查這一點嗎? –

+0

您不需要預先檢查的機制。 'Promise.all'從一系列承諾中做出單一承諾。你是什​​麼意思,他們被推到不同的地方 –

回答

1

您不必擔心在傳遞到Promise.all之前解決的承諾:Promise.all在其(數組)參數完全評估之前不會被調用。只有當陣列準備好時,纔會調用Promise.all

這些承諾中的任何一個是否已經解決,在時間Promise.all被調用時,並不重要。 Promise.all將檢查哪些人處於已解決狀態,並且只有在所有人都完成時纔會調用其方法then。甚至可能是全部陣列中的承諾已經實現:沒問題,只要執行Promise.all,它就會安排執行then方法。即使這些承諾已經解決的時間並不重要。即使他們在一小時前得到解決,Promise.all仍然會正常工作。

+0

我不想檢查承諾是否已經解決,因爲這些信息都包含在promise中,並且'Promise.all()'會爲我檢查。我想確保'Promises.all()'不會觸發,因爲我可能沒有在我的數組中推送所有的promise。但根據@fatman的回答,'push'的'sync'操作總是會在任何'async'請求觸發之前發生。所以我想這不再是一個問題。感謝您的洞察力,不勝感激。 –

+1

當你將它傳遞給'Promise.all'時,你的數組將會完成。我的觀點是沒有辦法將一個不完整的數組傳遞給'Promise.all'(除非你當然這麼做,並且在調用'Promise.all'後修改數組*)。在調用傳遞參數的函數之前,JavaScript總是先評估參數。 – trincot

+0

其實這個答案是正確的 – Tomer

0

Axios.all calls Promise.all它返回它解決當迭代參數中的所有承諾都解決一個承諾。

Axios.spread將從getUserAccountgetUserPermission獲得解析值。

0

Push是一個同步操作,ajax是異步的。在運行任何異步操作之前,JS將始終運行所有同步操作,即使它已經完成。例如:

for (i=0;i<10000000;i++){ 
    console.log('looping'); 
} 

setTimeout(function(){ 
    console.log('running async') 
}, 0) 

儘管超時設置爲0,因此它可以立即運行,它會等到對循環完成,然後才運行異步操作。

因此,即使您推動承諾並立即解決,它也會等到推完後纔會對已解決的承諾作出反應。

+0

哇,我會測試這一點,並閱讀它。如果這是真的,那麼'Promises.all()'是處理多個AJAX請求的絕妙解決方案。黃金答案就在那裏。 –

+1

雖然異步和同步的解釋是正確的,但這並不是爲什麼首先評估「push」的原因:這是因爲這是JavaScript中正確的評估順序:參數(在這種情況下是數組)必須先完成在函數(向其傳遞參數,即'Promise.all')之前進行評估(同步執行)。所以這與異步代碼無關。 – trincot

相關問題