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() {
[1,2,3,4,5].forEach(async (item) => {
await sleep(1)
console.log(item)
console.log('完成')
withoutPromiseAll()
情境二: 循环里收集异步函数,最后用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()
以下是啰嗦踩坑过程,可忽略:
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