欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

循环中嵌套异步操作的流程控制

程序员文章站 2022-12-20 08:38:55
笔者最近在写node.js项目中遇到了一个比较有趣的流程控制需求需求是:先将多个object对象循环遍历后进行异步操作写入到数据库中去,等这部操作结束后在进行下一次的查询操作。这个流程需要注意的是在你foreach 或者 for循环的时候里面的异步操作是不会同步进行的,往往会导致时间相差而产生bug ......

笔者最近在写node.js项目中遇到了一个比较有趣的流程控制需求
需求是:先将多个object对象循环遍历后进行异步操作写入到数据库中去,等这部操作结束后在进行下一次的查询操作。
这个流程需要注意的是在你foreach 或者 for循环的时候里面的异步操作是不会同步进行的,往往会导致时间相差而产生bug.

我在看了卷老师的博客后发现可以判断你循环对象的length,而每次执行结束后进行加一操作,如果长度足够,进行ruturn写法如下

let x = 0;
for (let x of arry){
   xxx.create(x).then(_=>{
      x= x+1;
      if(x===arry.length){
           return xxxxx;
       }
  })
}

  这种方式固然可行,但是仍然会有部分的性能不足,在社区大佬Miu的指点下我是用了js的特性,定义一个promise对象将这个异步操作全部push进去如下

  for(let item of datas){
                  proList.push(xxx.create(let));
              }
              return Promise.all(proList).then(function (data) {
}

 由于js的是由obecjt对象构成的,所以这里面可以将你定义的prolist中push大量的异步操作然后统一使用promis all来执行。然后使用then来控制流程就好了。
有趣的是js是个弱类型,但是大部分的变量所定义的指向位置都是内存,吾辈也算是在js的探索中跟进一步了