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由于异步而未正确执行嵌套循环的主要内容,如果未能解决你的问题,请参考以下文章
python中函数嵌套循环语句时,return 如何正确使用返回值