For 循环异步操作问题小结
在实际开发中,异步总是不可逃避的一个问题,尤其是 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(); } }
以上的方法基本上能解决大部分的问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论