[英]ES6 Iterator and settimeout
我正在嘗試迭代請求列表,但是在處理下一個請求之前有一個延遲。 我想到了使用ES6 Iterator進行以下操作,但是它不起作用...(控制台輸出對我來說凍結了,不知道為什么)
requests = [1,2,3,4,5,6];
delay = 2000;
const iterateCollection = requests => {
return new Promise((resolve, reject) => {
function *iterateRequests() {
for (const req of requests) {
yield req;
}
}
const requestIterator = iterateRequests();
let currentRequest = requestIterator.next();
while(!currentRequest.done) {
setTimeout(() => {
console.log(currentRequest);
currentRequest = requestIterator.next();
}, delay);
}
resolve();
});
};
iterateCollection(requests)
.then(() => console.log('done!'));
似乎setTimeOut不受歡迎。 如果我從代碼中刪除它(消除延遲),那么我將獲得預期的迭代而沒有延遲。
requests = [1,2,3,4,5,6];
delay = 2000;
const iterateCollection = requests => {
return new Promise((resolve, reject) => {
function *iterateRequests() {
for (const req of requests) {
yield req;
}
}
const requestIterator = iterateRequests();
let currentRequest = requestIterator.next();
while(!currentRequest.done) {
console.log(currentRequest);
currentRequest = requestIterator.next();
}
resolve();
});
};
iterateCollection(requests)
.then(() => console.log('done!'));
// OUTPUT
//{value: 1, done: false}
//VM85:26 {value: 2, done: false}
//VM85:26 {value: 3, done: false}
//VM85:26 {value: 4, done: false}
//VM85:26 {value: 5, done: false}
//VM85:26 {value: 6, done: false}
//VM85:35 done!
異步的事情被排入所謂的事件隊列,直到js引擎完成其當前任務,然后它將事件隊列中的下一個任務接管。 就您而言,當前任務是這樣的:
while(!currentRequest.done) {
由於數組具有一個元素,因此迭代器不會完成,並且循環將永遠運行。 所有超時都卡在事件隊列中,處理程序將永遠不會執行。 您可能只使用了async
所以您可以等待循環直到超時完成:
const timer = ms => new Promise(res => setTimeout(res, ms));
async function iterateCollection(collection){
for(const el of collection){
await timer(1000);
//...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.