初学者,实在搞不清楚了,请教各位 问题写在注释里了
补充,大致知道咋回事了,for循环里面还有一个数据库查询,两个异步嵌套,立马就懵逼了 解决方案在后面,往下拉
// 有学校、部门两个表,学校表字段是id name,部门表的字段是id name school_id // 获取学校列表,然后根据学校id去查询每个学校下的部门数量,再给每个学校增加部门数量depNum,组成新的学校对象,字段有id name depNum,然后渲染模板
var listSchools = async () => {
return new Promise((resolve, reject)=> {
pool.query('SELECT * FROM schools
', function (err, rows) {
if (err) {
console.log(err);
reject(err);
}
else{
resolve(rows);
}
});
});
}
// 现在卡在这一步了,不知道怎么实现先for循环获取到部门数量之后再渲染模板
// 也就是说不知道怎么用Promise写for循环
var listDepartments = async schools => {
for(let school of schools){
pool.query(‘SELECT * FROM departments
WHERE school_id = ?’, school.id, function(err, rows) {
school.depNum = rows.length; //获取每个学校的部门数量
});
}
}
listSchools().then(listDepartments).then(//渲染模板).catch(err=>{console.log(err)})
感谢楼下的指点,问题已经解决了,贴出最终代码
es6 promise.all
看你的代码已经用上了async
,那么我给你写一个使用ES7 async的方式实现的例子:
function sleep(t) {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve();
}, t * 1000);
});
}
(async function test() {
for (var i = 1; i < 10; i++) {
await sleep(i);
console.log(i);
}
})();
也可以看看 async控制爬虫流程
只看到你用async
, 你把await
呢?
@nnliang 用then了好像不需要await?晕菜了已经,刚学后端就挑了个异步的学
@satrong 好像是这个能解决,我试一下,谢谢!朋友告诉我查询数据库根本不要这样查,直接join查询出统计结果就行了
@zbsccc 用了async/await
还要用then
?
@satrong 成功了!谢谢
@nnliang 因为await里面嵌套了一个异步,await无效
@zbsccc 循环用Promise.all
,在循环上我也没有找到用async/await
更好的处理方法。。。
@nnliang 看我主楼的更新,你用的Promise.all是第三方库的用法吗?我不大想用第三方,用不了几天就过时了
@zbsccc bluebird 过时还要些日子的吧
@nnliang 蓝鸟写起来比我这个能简化很多不
@zbsccc 写法上差的不是太多, 但是个人觉得:但是思路方面可以流畅很多,更容易让人理解。