如何用Promise控制for循环的异步流程?(已解决)
发布于 7 年前 作者 zbsccc 14372 次浏览 来自 问答

初学者,实在搞不清楚了,请教各位 问题写在注释里了

补充,大致知道咋回事了,for循环里面还有一个数据库查询,两个异步嵌套,立马就懵逼了 解决方案在后面,往下拉 Snip20170103_2.png

// 有学校、部门两个表,学校表字段是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)})

感谢楼下的指点,问题已经解决了,贴出最终代码 Snip20170103_7.png

13 回复

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 写法上差的不是太多, 但是个人觉得:但是思路方面可以流畅很多,更容易让人理解。

回到顶部