Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

for循环异步操作问题小结 #29

Open
huruji opened this issue Apr 1, 2018 · 0 comments
Open

for循环异步操作问题小结 #29

huruji opened this issue Apr 1, 2018 · 0 comments

Comments

@huruji
Copy link
Owner

huruji commented Apr 1, 2018

在实际开发中,异步总是不可逃避的一个问题,尤其是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();
    }
}

以上的方法基本上能解决大部分的问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant