JavaScript异步处理问题,循环处理异步任务,并拿到数据,Nodejs循环异步任务接口处理

Posted 苦海123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript异步处理问题,循环处理异步任务,并拿到数据,Nodejs循环异步任务接口处理相关的知识,希望对你有一定的参考价值。

一、问题描述及解答:

在Promise(异步事件)中,通过遍历的方式处理数据,最后将带有数据的Promise通过return返回,在async/await处理机制中的到的数据是一个空数据组[]或不完整的数据,如下:

使用定时器后数据完整的拿到了,如:

最终解决问题如下:

二、原理剖析:

上面代码看起来肯定乱糟糟的,我平时刷到这种文章也是直接差掉,那么现在就将最基本原理总结下面:

// 问题代码:
function getResult() 
  let arr = [];
  for (let i = 0; i < 3; i++) 
  //循环中使用异步api,这里是用定时器代替:
    setTimeout(() => 
      arr.push(i)
    , 0)
  
  console.log(arr) // 打印的结果为:[]

getResult()

// 正常代码:
function getData() 
  let arr = [];
  let promiseArr = [];
  for (let i = 0; i < 3; i++) 
    // 循环中创建Promise对象:
    let dp = new Promise((resolve) => 
      // Promise回调中处理当前异步任务,之后resolve
      setTimeout(() => 
        arr.push(i);
        resolve()
      , 0)
    )
    // 当前循环里面,Promise外面给临时数组追加数据
    promiseArr.push(dp)
  
  // 循环外面等待所有Promise任务完成,在做数据响应
  Promise.all(promiseArr).then(res => 
    console.log(arr) // 打印结果:[ 0, 1, 2 ]
  )

getData()

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者 删除。
笔者:苦海

以上是关于JavaScript异步处理问题,循环处理异步任务,并拿到数据,Nodejs循环异步任务接口处理的主要内容,如果未能解决你的问题,请参考以下文章

一篇搞定(Js异步事件循环与消息队列微任务与宏任务)

一篇搞定(Js异步事件循环与消息队列微任务与宏任务)

JavaScript的异步处理

进阶学习5:JavaScript异步编程——同步模式异步模式调用栈工作线程消息队列事件循环回调函数

同步异步和Event loop事件循环

JavaScript 实现异步任务循环顺序执行