Promise是什么?
Promise是ES6加入标准的一种异步编程解决方案,通常用来表示一个异步操作的最终完成(或失败)。Promise标准的提出,解决了JavaScript地狱回调的问题。
语法
var p = new Promise( function(resolve, reject) {...} /* executor */ );
p.then(() => {}) // 成功resolve
.catch(()=> {}); // 失败reject
Promise构造函数
Promise构造函数executor函数,resolve和reject两个函数作为参数传递给executor(executor函数在Promise构造函数返回所建Promise实例对象前被调用)。resolve和reject函数被调用时,分别将Promise的状态改为fullfilled(完成)或rejected(失败)。executor内部通常来将promise状态改为fulfilled,要么调用reject函数将promise的状态改为rejected。如果在executor函数中抛出一个错误,那么该promise改为rejected。executor函数的返回值将被忽略。
描述
Promise对象在创建之后,并不一定会马上就有值,只是一个代理结果,它存在三种状态:
- pending: 初始状态(等待状态),既不是成功,也不是失败状态;
- fullfilled: 意味着操作成功完成;
- rejected: 意味着操作失败完成。
方法
Promise.all(iterable)
这个方法返回一个新的Promise对象。一般该方法会接受一个iterable参数,里面是一个Promise列表,当所有的promise都触发成功时才会触发成功,一旦有一个失败了,则会马上停止其他Promise的执行。当iterable里面的结果都执行成功了,这个新的Promise对象会将所有的结果以数组的形式依次返回。当有一个失败时,这个新的Promise对象会将失败的信息返回。
Promise.race(iterable)
当iterable参数里的任意一个子promise被成功或失败后,父Promise马上也会用子Promise的成功返回值或失败详情作为参数调用父Promise绑定的相应句柄,并返回该Promise对象
Promise.reject(rease)
返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法
Promise.resolve(value)
返回一个状态由给定value决定的Promise对象。如果该值时thenable(即,带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定;否则的话(该value为空,基本类型或者不带then方法的对象),返回的Promise对象状态为fullfilled,并且将该value传递给对应的then方法。通常而言,如果你不知道一个值是否是Promise对象,使用Promise.resolve(value)来返回一个Promise对象,这样就能该value,以Promise对象形式使用
Promise基本规则
- 首先Promise构造函数会立即执行,而Promise.then()内部的代码在当次事件循环的结尾立即执行(微任务)
- Promise的状态一旦由等待pending变为成功fulfilled或者失败rejected。那么当前Promise被标记为完成,后面则不会再次改变该状态。
- resolve函数和reject函数都将当前Promise状态改为完成,并将异步结果,或者错误结果当做参数返回。
- Promise.resolve(value)
返回一个状态由给定value决定的Promise对象。如果该值是thenable(即,带有then方法的对象),返回的Promise对象的最终状态由then方法执行决定;否则的话(该value为空,基本类型或者不带then方法的对象),返回的Promise对象状态为fulffiled,并且将该value传递给对应的then方法。通常而言,如果你不知道一个值是否是Promise对象,使用Promise.resolve(value)来返回一个Promise对象,这样就能将该value以Promise对象形式使用
- Promise.all(iterable)/Promise.race(iterable)
简单理解,这2个函数,是将接收到的Promise列表的结果返回,区别是,all是等待所有的Promise都触发成功了,才会返回,而race有一个成功了就会返回结果。其中任何一个promise执行失败了,都会直接返回失败的结果。
- Promise对象的构造函数只会调用一次,then方法和catch方法都能多次调用,但一旦有了确定的结果,再次调用就会直接返回结果。