美文网首页
JavaScript等待所有异步任务完成后才执行

JavaScript等待所有异步任务完成后才执行

作者: 毕竟1米八 | 来源:发表于2020-04-12 16:42 被阅读0次

最近练习项目时,遇到第三方提供的API是一个异步函数(如小程序云开发),导致同步任务先执行,造成了参数没有正常的提交。最后用Promise解决~

1.出现问题
大家应该都知道,js属于单线程机制,所有任务都需要排队,前一个任务结束,才会执行后一个任务。同步任务console.log(arr)先执行了,因此返回[],等同步执行完毕后再执行异步任务setTimeout()。

function onPublic() {
  let arr = [];
  for (let i = 0; i < 3; i++) {
  //当第三方api提供的是异步方法时 这里用setTimeout模拟
    setTimeout(() => {
      console.log(i)
      arr.push(i)
    }, 0)
  }
  //arr就会先执行 返回[] 0 1 2
  console.log(arr)
}

2.解决问题
那如何正常的返回arr里面的数据呢?同理,把console.log(arr)改成异步方法即可。这里使用Promise.all方法,等待上面所有的Promise任务执行完毕后再执行。

function onPublic() {
  let arr = [];
  let promiseArr = [];
  for (let i = 0; i < 3; i++) {
    let p = new Promise((resolve, reject) => {
    //当第三方api提供的是异步方法时 这里用setTimeout模拟
    setTimeout(() => {
      console.log(i)
      arr.push(i);
      resolve()
    }, 0)
    })
    promiseArr.push(p)
  }
  //等所有promise任务执行完毕后再执行 返回0 1 2 [0,1,2] 
  Promise.all(promiseArr).then(res => {
    console.log(arr)
  })
}

相关文章

  • JavaScript等待所有异步任务完成后才执行

    最近练习项目时,遇到第三方提供的API是一个异步函数(如小程序云开发),导致同步任务先执行,造成了参数没有正常的提...

  • JavaScript事件循环机制

    JavaScript单线程执行 同步栈执行完成后,再执行异步队列 异步队列中分为宏任务和微任务 微任务比宏任务优先...

  • 【javaScript练习】2021-02-23

    javaScript 作用域,异步执行,requestAnimationFrame 微任务,宏任务,异步执行 Ar...

  • event loop

    javascript是单线程的 任务队列 所有的任务分为同步任务和异步任务,同步任务是在主线程上排队执行的,异步任...

  • nextTick、setImmediate、promise.re

    执行队列(同步) 任务队列(异步事件) 每当异步任务完成后会在任务队列中添加一个关联事件,待执行队列任务执行完成...

  • 深入浅出Javascript事件循环机制-上(转)

    浅薄概念 Javascript是单线程,执行任务时,分同步任务和异步任务,执行同步任务时放入栈中执行,执行异步任务...

  • 使用 GCD 控制线程执行顺序

    前言 需求:有三个异步执行的任务A、B、C,任务 C 必须等待任务 A 和 任务 B 执行完毕才执行。 本文分别采...

  • dispatch_group_notify 异步任务通知

    iOS异步任务,异步执行四个任务等待所有任务都完成之后执行总任务.这个可能在实际的需求中会存在多个网络请求但是需要...

  • GCD dispatch_barrier_async和dispa

    1、栅栏函数使用场景 异步执行两组操作,且第一组操作(多个任务)执行完成后,才开始执行第二组操作(多个任务)。 2...

  • JavaScript的执行机制

    一、重要理论 1、JavaScript是单线程语言,所有任务都是同步执行的。但是可以通过同步的方法实现异步执行...

网友评论

      本文标题:JavaScript等待所有异步任务完成后才执行

      本文链接:https://www.haomeiwen.com/subject/zvcbmhtx.html