Promise.all()介绍

Promise.all(iterable) 此方法在集合多个 promise 的返回结果时很有用
方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);
如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。

抄自 MDN Promise.all()

首先有一个异步的函数:

function sleep() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve()
    }, 1000)

情境一:直接在循环里调用异步函数

async function withoutPromiseAll() {
  [12345].forEach(async (item) => {
    await sleep(1)  
    console.log(item)
  console.log('完成')
withoutPromiseAll()
// 这里的执行结果是:
// 		完成
// 		1
// 		2
// 		3
// 		4
// 		5 
// 以上数据基本同时依次打印出来

情境二: 循环里收集异步函数,最后用Promise.all()执行

async function promiseAll() {
  let promiseArr = []
  arr.forEach(item => {
    promiseArr.push((async (item) => {
      await sleep(1)
      console.log(item)
    })(item))
  await Promise.all(promiseArr)
  console.log('完成')
promiseAll()
// 这里的执行结果是:
// 		完成
// 		1
// 		2
// 		3
// 		4
// 		5 
// 以上数据间隔 1s 逐个打印出来

以下是啰嗦踩坑过程,可忽略:

TreeView 做子节点的懒加载,懒加载的处理函数中,要组织节点自己的数据,组织数据的过程中需要循环某部分数据,而循环时候在对item的处理中,涉及到了异步的操作,就是出现了 循环 + 异步 的操作。

循环方法用的是forEach,现象就是,点击节点节点的时候,并没有得到理想的子节点展开,但是查看数据 这个时候是理想数据。意识到是不是同步异步的问题,就各种骚操作都试了一下,还是没有达到想要的结果。

一筹莫展之时,想起前几天做别的需求时候,在github看别人代码时候看到Promise.all操作,就是用来处理多个异步,同时又搜了一下“异步循环”,刚好看到有涉及到这个方法的操作,改成Promise.all(), 问题果然解决了。

var scandir = require ( 'scandir-async' ) , exec = require ( 'scandir-async' ) . exec ; scandir . exec ( [ folder ] , [ options ] ) . then ( function ( data ) { // Q.promise resolved } , function ( err ) { // Q.promise rejected } ) ; // or exposed exec ( [ folder ] , [ options ] ) . then ( function ( data ) { // Q. Promise.all() 方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例,那个输入的所有promise的resolve回调的结果是一个数组。这个Promise的resolve回调执行是在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法... stroll ( obj , function ( v , k , next ) { setTimeout ( function ( ) { next ( null , v + ' ' + v ) } , 50 ) } , function ( err , obj ) { if ( err ) throw err ; assert . deepEqual ( obj , Node.js和浏览器会警告未处理的承诺拒绝。 您可能已经看到: (node:1234) UnhandledPromiseRejectionWarning 当发生这种情况时,未兑现什么承诺并不总是很明显。 错误堆栈跟踪将告诉错误对象构造在哪里,而不是使悬而未决的承诺的构造。 在到达未处理的承诺链之前,它可能已经遍历了各种异步链。 trace-unhandled对此trace-unhandled帮助。 它跟踪承诺,并记录未处理的承诺拒绝时,将记录错误对象和承诺的位置。 这使得查找错误变得容易得多。 此软件包不打算在生产中使用,仅用于帮助查找错误 考虑下面的代码,它在第1行上产生一个错误,并在第3行上拒绝一个诺言,而在第9行(最后一行)中捕获“ forgets”以捕获它。 这是一个非常简单的示例,在现实生活中,这将涉及很多文件和很多复杂性。 1. const err 数组遍历中每次遍历都需要去请求getStaffCover接口,拿到该接口的结果拼接到数组的每一项,等到数组遍历完之后,拿到拼接好的数组。拼接的数组必须是最终遍历的结果,所以得等到所有的请求结束之后进行操作,使用map可以返回每一次异步请求的Promise合集,注意这里不需要return,然后使用Promise.all等待执行完所有的异步操作,然后才会执行后面的代码 const promise = nv.aiFaceData.items.map(async item => { 项目中有个批量签署功能,需要循环获取pdf文件 发现直接发送ajax请求 因为返回的顺序不同,导致签署有问题,遂想到使用promise.all来解决问题 getPdfList() { const paramslist = this.list.map((item) => { return { billsType: this.signObj.flag, drId: item.drId, signFileId: ite if(that.data.files.length>0){ that.data.files.map((item)=>{ let base64 = wx.getFileSystemManager().readFileSync(item, "base64"); let p= new. 首先拿到4个pending的promise对象,然后分别.then注册成功的回调,一秒后res1、res2、res3, res4状态变为fulfilled,最后从上到下依次打印结果,四块代码会同时执行。如果使用for循环,就能够按顺序输出1,2,3,4。隔9秒输出1, 隔8秒输出2, 隔7秒输出3, 隔6秒输出4。题干:通过数组中的值设定第一个promise使用9秒,第二个使用八秒,第三个使用七秒,第四个使用六秒。先隔七秒输出4,然后每隔一秒输出一个3,2,1。4 forEach没有for循环效率高。 一是如何让所有的for循环中的Promise操作结束后执行某个操作 二是循环中如果后一个Promise的执行依赖与前一个Promise的执行结果(例如对于某个数据库操作) 先看一个生成Promise对象的方法 function createPromise() { var promise; promise = new Promise(function(resolve, reject) { var elapse = Math.random() * 2000; setTimeout(resolv