假設我們有一個必須上傳到云服務的物件陣列,該服務將對每個物件執行一些操作并回傳一個結果。該服務的客戶端庫具有上傳物件并等待回應的單一功能。哪些代碼會運行得更快:
async function extractDataInstantAwait(documents) {
const results = [];
for (const doc of documents) {
results.push(await client.extractData(doc));
}
return results;
}
async function extractDataPromiseAll(documents) {
const results = [];
for (const doc of documents) {
results.push(client.extractData(doc));
}
return Promise.all(results);
}
據我所知,Nodejs 不會在多個執行緒中運行異步代碼,因此可能有人認為它們之間沒有區別。但是,由于每次呼叫都client.extractData可能需要等待回應,Nodejs 的事件回圈應該切換到下一個承諾,在那里做事(上傳另一個檔案),然后重復。也許,如果服務在決議每個物件時很慢,但我們知道它為每個操作創建新執行緒,我們可以實作某種并發加速?
我的邏輯正確嗎?
uj5u.com熱心網友回復:
Promise.all 更快,因為 Promise.all 讓所有 Promise 并行運行,所以你的執行時間將是最長 Promise 的執行時間(或接近它)。
如果您在回圈中執行此操作,則 Promise 會一個接一個地執行,因此您的執行時間將是所有 Promise 執行時間的總和。
如果您必須等待三個承諾 A、B 和 C,它們分別需要 200、300 和 500 毫秒。使用 Promise.all 它們將同時運行,您必須等待 C 500 毫秒(A 和 B 將在此之前完成)。使用回圈,您必須等待 A 200 毫秒,然后等待 B 300 毫秒,然后等待 C 500 毫秒,因此您總共將等待 1000 毫秒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/467609.html
標籤:javascript 节点.js 承诺 执行时间处理时间
