首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在循环前后管理异步函数

如何在循环前后管理异步函数
EN

Stack Overflow用户
提问于 2019-09-24 20:43:24
回答 1查看 49关注 0票数 1

如何在异步循环之后运行异步函数?循环不返回承诺,这意味着不能使用等待语法来管理执行顺序。什么是一个很好的方式来管理一个循环像一个承诺。

这个问题发生在我的快递线路上。在使用循环从reids DB检索数据之后,我尝试运行res.json,但是如果我将代码放在后面,res.json将在循环之前运行。我用了一种愚蠢的方法。我检测循环的最后一次迭代并运行我的res.json函数。我认为这不应是解决这个问题的正确办法。

代码语言:javascript
复制
app.get('/redisApi/v0.3/users', (req, res) => {
  var users = [];
  redis.scan(0, 'MATCH', 'user:info:*', 'COUNT', 10000).then(key_res => {
    //where loop starts
    for (let i = 0; i < key_res[1].length; i++) {
      redis.hgetall(key_res[1][i]).then(user_res => {
        const newOBJ = Object.assign(user_res);
        users.push(newOBJ);
        //detect last iteration of the loop
        if (i === key_res[1].length - 1) {
          res.status(200).json({
            status: 'success',
            data: {
              users
            }
          });
        }
      });
    }
  });
});

寻找一种管理循环执行顺序的方法。

EN

回答 1

Stack Overflow用户

发布于 2019-09-24 21:06:44

有很多解决这个问题的工具,这里有两个:

  1. 如果要逐个触发异步调用,则在进行下一次调用之前等待最后一次调用:使用Bluebird.js mapSeries。提供要映射的key_res[1].length数组和映射函数的循环逻辑。
  2. 如果您想一次触发异步调用,但等待所有调用完成:只需在一个新数组中收集redis.hgetall返回的承诺,并在这个数组上使用Promise.all
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58087862

复制
相关文章

相似问题

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