首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ES6迭代器和settimeout

问ES6迭代器和settimeout
EN

Stack Overflow用户
提问于 2018-02-25 21:55:44
回答 1查看 390关注 0票数 1

我正在尝试迭代一个请求列表,但在处理下一个请求之前会有延迟。我想用ES6迭代器来做这件事,如下所示,但它不起作用……(控制台输出为我冻结,不确定原因)

代码语言:javascript
复制
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并不受欢迎。如果我从代码中删除它(删除延迟),我就会得到预期的迭代,而没有延迟,如下所示。

代码语言:javascript
复制
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!
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-25 22:06:32

异步事物在所谓的事件队列中排队,直到js引擎完成其当前任务,然后它从事件队列中取得下一个任务。在您的示例中,当前任务如下:

代码语言:javascript
复制
while(!currentRequest.done) {

因为您的数组有一个元素,所以迭代器没有完成,循环将永远运行。所有超时都会卡在事件队列中,处理程序将永远不会执行。您可以只使用async,这样您就可以等待循环,直到超时结束:

代码语言:javascript
复制
 const timer = ms => new Promise(res => setTimeout(res, ms));

async function iterateCollection(collection){
  for(const el of collection){
    await timer(1000);
     //...
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48974235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档