语法:Promise.all(iterable);
参数:iterable
一个可迭代对象,如 Array 或 String。
返回值:如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的 Promise。
如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved) Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的 Promise。
其它情况下返回一个处理中(pending)的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。 见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定。


Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。

Promise.all([])
全部加载成功 则返回所有resolve按顺序所集合的数组
有一个失败 则立即返回失败的reject
空数组 则直接成功

Promise.all()
1、Promise.all方法可以把多个promise实例包装成一个新的promise实例;
Promise.all([promise1,promise2]):Promise---最终返回Promise实例;
2.全部加载成功 则返回所有promise实例中resolve()回来带的参数,按数组中一一对应的顺序所集合的数组
若任意有一个失败 ,立即决议失败,将失败的promise实例(reject()中参数)传递给我们;
3.若Promise.all([ ])中,数组为空数组,则立即决议为成功执行resolve( );

 数组项全部决议为成功时:
            //Promise.all方法可以把多个promise实例 包装成一个新的promise实例
//Promise.all([ promise1, promise2]) :Promise 接收一个数组,数组中的每一项都是promise实例,最终返回的也是一个promise实例 //它分三种情况,第一种是数组中的所有promise都决议为成功的话,Promise.all就会决议为成功;
//第二种是数组中任意一个promise实例决议为失败的时候,Promise.all就会立即决议为失败
//第三种是Promise.all()中是一个空数组的时候,Promise.all就会立即决议为成功 //模拟需要多个请求的数据,才能进行下一步操作的情况 function getData1(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第一条数据加载成功');
resolve('data1');
},1000)
})
} function getData2(){
return new Promise( (resolve,reject) =>{
setTimeout( () => {
console.log('第二条数据加载成功');
resolve('data2');
},1000)
})
} function getData3(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第三条数据加载成功');
resolve('data3');
},1000)
})
} function getData4(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第四条数据加载成功');
resolve('data4')
},200)
})
} let p = Promise.all( [getData1(), getData2(), getData3(), getData4() ]) p.then(arr => {
console.log(arr) // ['data1', 'data2', 'data3', 'data4']
}, e => {
console.log(e)
})

结果如图:

 
 数组项有一项决议为失败时:
function getData1(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第一条数据加载成功');
resolve('data1');
},1000)
})
} function getData2(){
return new Promise( (resolve,reject) =>{
setTimeout( () => {
console.log('第二条数据加载成功');
resolve('data2');
},1000)
})
} function getData3(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第三条数据加载成功');
resolve('data3');
},1000)
})
} function getData4(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第四条数据加载成功');
reject('data4 err')
},500)
})
} let p = Promise.all( [getData1(), getData2(), getData3(), getData4() ]) p.then(arr => {
console.log(arr)
}, e => {
console.log(e) //data4 err
})

结果如图:

当数组项为空时,直接决议成功:

function getData1(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第一条数据加载成功');
resolve('data1');
},1000)
})
} function getData2(){
return new Promise( (resolve,reject) =>{
setTimeout( () => {
console.log('第二条数据加载成功');
resolve('data2');
},1000)
})
} function getData3(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第三条数据加载成功');
resolve('data3');
},1000)
})
} function getData4(){
return new Promise( (resolve,reject) => {
setTimeout( () => {
console.log('第四条数据加载成功');
reject('data4 err')
},500)
})
} let p = Promise.all( [ ]) p.then(()=> {
console.log('数组为空') // 数组为空
}, e => {
console.log(e)
})

结果如图:

Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。

代码模拟:

let wake = (time) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`${time / 1000}秒后醒来`)
}, time)
})
} let p1 = wake(3000)
let p2 = wake(2000) Promise.all([p1, p2]).then((result) => {
console.log(result) // [ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
console.log(error)
})
需要特别注意的是,Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的,即p1的结果在前,即便p1的结果获取的比p2要晚。这带来了一个绝大的好处:在前端开发请求数据的过程中,偶尔会遇到发送多个请求并根据请求顺序获取和使用数据的场景,使用Promise.all毫无疑问可以解决这个问题。

 

Promise.all()的更多相关文章

  1. Promise.race()

    Promise.race([ ])---race竞赛,只要有一个决议了,就返回一个promise实例(对应resolve()或reject( )中参数值: 1.与Promise.all()对应的,还有 ...

  2. Promise.resolve()与Promise

    //Promise.resolve()和Promise.reject()常用来生成已经被决议为失败或者成功的promise案例 //Promise.reject()简单一些,不管传给它什么值,它决议为 ...

  3. ES6语法(3)—— 用promise()对象优雅的解决异步操作

    Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大. 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. ...

  4. Promise,Generator(生成器),async(异步)函数

    Promise 是什么 Promise是异步编程的一种解决方案.Promise对象表示了异步操作的最终状态(完成或失败)和返回的结果. 其实我们在jQuery的ajax中已经见识了部分Promise的 ...

  5. JavaScript Promise启示录--(转)

    本博文转至:http://www.csdn.net/article/2014-05-28/2819979-JavaScript-Promise [编者按]JavaScript是一种基于对象和事件驱动并 ...

  6. 彻底理解Javascript 中的 Promise(-------------------------------***---------------------------------)

    ES6原生提供了 Promise 对象. 到底是何方妖怪呢?打出来看看: 所谓 Promise,就是一个对象,用来传递异步操作的消息.它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个 ...

  7. jQuery使用():Deferred有状态的回调列表(含源码)

    deferred的功能及其使用 deferred的实现原理及模拟源码 一.deferred的功能及其使用 deferred的底层是基于callbacks实现的,建议再熟悉callbacks的内部机制前 ...

  8. jQuery Deferred对象详细源码分析(-)

    本系列文章讲介绍这个Deferred东西到底拿来干什么,从1.5版本加进来,jQuery的很多代码都重写了.直接先上源码分析了,清楚了源码分析,下节将讲具体的应用 以及应用场景. 创建对象 var d ...

  9. 以下C#程序的输出结果是( )。

    以下程序的输出结果是( ). using System; namespace HoverTreeTikuConsole { class Program { static void Main(strin ...

随机推荐

  1. etcd学习(4)-centos7中部署etcd

    etcd的搭建 前言 单机 集群 创建etcd配置文件 更新etcd系统默认配置 启动 配置ETCD为启动服务 测试下 参考 etcd的搭建 前言 这里记录下如何搭建etcd 单机 在etcd的rel ...

  2. .net 5+ 知新:【2】 .Net Framework 、.Net 、 .NET Standard的概念与区别

    作为了解历史和眼睛或者过程,我们需要将 .Net Framwork ..Net. .Net Stander几个概念进行下理解. .net 代表跨平台框架,从.net 5开始就统一叫.net,废弃原来的 ...

  3. 为什么大家都在用WebRTC?

    WebRTC代表网络实时通信.它是一种非常令人兴奋,强大且具有高度破坏性的尖端技术和标准.自从WebRTC诞生以来,80%的浏览器都开始支持它.有数据显示,2017年~2021年期间,WebRTC市场 ...

  4. Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用

    使用Dapr 客户端 处理服务调用,需要遵循的他的模式,通常代码是这个样子的: var client = DaprClient.CreateInvokeHttpClient(appId: " ...

  5. centos ansible常用命令

    ansible在日常运维中经常使用,特别是批量执行多台服务器的时候,有效减小重复的操作成本,以下从安装到使用仅讲解工作中常用的几种方式,模块很多功能很强大,但不做全面讨论. ansible安装 在ce ...

  6. 那些 Unix 命令替代品们「GitHub 热点速览 v.21.32」

    作者:HelloGitHub-小鱼干 好用的 Unix 命令替代工具能让你事半功倍,例如,bat 便是个带着高亮特性的加强版 cat,就像你用了 oh my zsh 之后便会感受到它的强大.同样好用的 ...

  7. shell $? 状态码含义

    Linux 使用了$? 来保存上个执行的命令的退出状态码. 0                命令成功结束 1                通用未知错误 2                误用she ...

  8. Discuz ML RCE漏洞

    1.漏洞描述 Discuz国际版漏洞存在于cookie的language可控并且没有严格过滤,导致可以远程代码执行. 2.产生原因:Discuz!ML 系统对cookie中的l接收的language参 ...

  9. 还怕问源码?Github上神级Android三方源码解析手册,已有7.6 KStar

    或许对于许多Android开发者来说,所谓的Android工程师的工作"不过就是用XML实现设计师的美术图,用JSON解析服务器的数据,再把数据显示到界面上"就好了,源码什么的,看 ...

  10. Spring对Controller、Service、Dao进行Junit单元测试总结

    测试类注解 @RunWith(SpringRunner.class) @SpringBootTest(classes={DemoApplication.class}) 以Controller层的的单元 ...