我有一個回圈迭代 1000 次,每次迭代發出一個請求,然后列印該請求的結果。
類似于下面。
let start = console.log(Date.now())
for (i = 0; i < 1000; i ) {
request.then(data => {
console.log(Date.now() - start)
})
}
然而,如果回圈只進行 1 次迭代,則這會導致第一個請求需要更長的時間才能完成。
當 i < 1000 時:
5860
...
當我 < 1:
220,
...
然而,為了這個腳本的目的,我想在開始下一次回圈迭代之前等待接收到每個結果。
uj5u.com熱心網友回復:
如果您想堅持使用 ES5 處理 Promise 的方式,您可以使用以下方法:
const start = console.log(Date.now())
// Create a instantly resolved promise
for (let i = 0, p = Promise.resolve(); i < 1000; i ) {
// append new promise to the chain
p = p.then(() => request()
.then(() => console.log(Date.now() - start));
}
如果你可以使用 ES6 方法,你可以使用這樣的async/await模式來撰寫它:
const asyncLoop = async () => {
const start = console.log(Date.now())
for (let i = 0; i < 1000; i ) {
const data = await request();
console.log(Date.now() - start);
}
}
asyncLoop();
您真正想要一個接一個地發出請求的機會實際上很小,所以如果您想同時發出請求,但在所有請求都解決后做某事,您可以使用 Promise.all(...)
const start = console.log(Date.now())
const requests = [request1, request2, ...];
Promise.all(requests)
.then(() => console.log(Date.now() - start));
uj5u.com熱心網友回復:
您可以在此處使用 async-await 模式。您可以通過更改代碼來實作此目的
async function iteration() {
let start = console.log(Date.now())
for (let i = 0; i < 1000; i ) {
const data = await httpRequest()
console.log(Date.now() - start)
}
}
async function httpRequest() {
return new Promise((resolve, reject) => {
request.then(data => {
//Do anything you want to do with data
resolve(data)
}).catch(error => {
console.error(`Error in request`)
reject(error)
})
})
}
解釋:
- 我已將請求代碼移動到單獨的函式httpRequest 中,此函式將在成功時回傳承諾
- 我使用 await 關鍵字在 for 回圈中呼叫了httpRequest,現在回圈將等待請求完成
- 我還在函式中包裝了 for 回圈代碼,因為您只能在 async 函式中使用 await
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/339621.html
標籤:javascript 循环 要求
