簡體   English   中英

ES6迭代器和settimeout

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM