在实际开发中,异步总是不可逃避的一个问题,尤其是Node.js端对于数据库的操作涉及大量的异步,同时循环又是不可避免的,想象一下一次一个数据组的存储数据库就是一个典型的循环异步操作,而在循环之后进行查询的话就需要确保之前的数据组已经全部存储在了数据库中。可以得到关于循环的异步操作主要有两个问题:
- 如何确保循环的所有异步操作完成之后执行某个其他操作
- 循环中的下一步操作依赖于前一步的操作,如何解决
如何确保循环的所有异步操作完成之后执行某个其他操作
方法一:设置一个flag,在每个异步操作中对flag进行检测
let flag = 0;for(let i = 0; i < len; i++) { flag++; Database.save_method().exec().then((data) => { if(flag === len) { // your code } })}复制代码
方法二:将所有的循环放在一个promise中,使用then处理
new Promise(function(resolve){ resolve() }).then(()=> { for(let i = 0; i < len; i++) { Database.save_method().exec() }}).then(() => { // your code})复制代码
循环中的下一步操作依赖于前一步的操作,如何解决
方法一:使用递归,在异步操作完成之后调用下一次异步操作
function loop(i){ i++; Database.save_method().exec().then(() => { loop(i) })}复制代码
方法二:使用async和await
async function loop() { for(let i = 0; i < len; i++) { await Database.save_method().exec(); }}复制代码
以上的方法基本上能解决大部分的问题。