Node.js由于异步而未正确执行嵌套循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js由于异步而未正确执行嵌套循环相关的知识,希望对你有一定的参考价值。

let data = ;
sql.query("SELECT * FROM courses WHERE name = ?", [name], function(err, course) 
  if (err) result(null, err);
  else 
    data.id = course[0].id;
    data.course = course[0].name;
    data.terms = []

    sql.query("SELECT * FROM terms WHERE course_id = ?", [course[0].id], function(err, term) 
      if (err) result(null, err);
      else 
        for (let i = 0; i < term.length; i++) 
          data.terms.push(
            id: term[i].id,
            name: term[i].name,
            modules: []
          );
          sql.query("SELECT * FROM modules WHERE term_id = ?", [term[i].id], function(err, module) 
            if (err) result(null, err);
            else 
              for (let j = 0; j < module.length; j++) 
                data.terms[i].modules.push(
                  id: module[j].id,
                  name: module[j].name,
                  topics: []
                );
                sql.query("SELECT * FROM topics WHERE module_id = ?", [module[j].id], function(err, topic) 
                  if (err) result(null, err);
                  else 
                    for (let k = 0; k < topic.length; k++) 
                      data.terms[i].modules[j].topics.push(
                        id: topic[k].id,
                        name: topic[k].name
                      );
                    
                    if (i === term.length - 1) result(null, data);
                  
                );
              
            
          );
        
      
    );
  
);
答案

我建议您使用Bluebird软件包。这是npm页面https://www.npmjs.com/package/bluebird的链接,您以前尝试过吗?

此外,您还可以在http://bluebirdjs.com/docs/getting-started.html处看到正式的文档页面>

这里是我最近正在研究的一些项目的摘要。我将其粘贴在此处作为示例。

在while循环内,Bluebird遍历一组玩家并等待(一秒钟),然后移至下一个数组项:

别忘了先导入蓝鸟:const Promise = require('bluebird');

while(someCondition) 
  await Promise.each(players, async (p) => 
    const team = this.getTeamByPlayer(p);
    logger.info(`[$team.name] $p.nombre is making a move`);
    p.jugar();
    await this.wait(1000);
  )
 

this.wait(n)是实现异步超时的类方法

如您所见,我在迭代过程中以及循环内也在使用async / await。

[Bluebird还有一个Promisify方法,可以帮助您以“异步/等待”方式编写代码,使您的代码最清晰!

让我知道您是否有任何疑问!

希望有帮助!

卢卡斯-

以上是关于Node.js由于异步而未正确执行嵌套循环的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 循环遍历嵌套的 Javascript 对象

python中函数嵌套循环语句时,return 如何正确使用返回值

python中嵌套循环的执行顺序[重复]

重构嵌套回调、node.js、异步

哪种方式更方便在无限循环中执行异步函数,每次执行之间都休眠(Node.js / Vanilla JS)

异步 node.js:带有回调的嵌套数组