什么是promise?
Promise对象代表:了未来将要发生的事件,用来传递异步操作的消息
Promise对象的两个特点:
- Promise对象的状态不受外界的影响,每个Promise对象代表一个异步操作,总共有三种状态:
- pending(等待) : 初始状态,不是成功或者失败的状态
- fulfilled(已完成) : 成功时的状态,意味着操作成功完成
- rejected(已拒绝) : 失败时的状态,意味着操作失败
总之,只有异步操作的结果,可以决定当前是哪一种状态,任何其他的操作都无法改变这个状态
- Promise对象一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象状态改变只有两种情况,从“等待(pending)”转到“完成(fulfilled)”态或者“拒绝(rejected)”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。
Promise的优缺点:
- 优点:Promise对象可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。而且,Promise对象提供统一的接口,使得控制异步操作更加容易
- 缺点:首先Promise对象一旦新建就会立即执行,无法中途取消;其次,Promise对象如果不设置回调函数,其内部会抛出错误,不会反应到外部;最后,当Promise对象处于pending状态时,无法得知目前进展到哪个阶段,即使刚刚开始还是即将完成。
Promise创建:
要想创建一个Promise对象,可以使用new来调用Promise的构造器来进行实例化,如下代码:
var promise = new Promise(function(resolve, reject) {
// 异步处理
// 处理结束后、调用resolve 或 reject
});
分析以上代码,Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。
Promise对象方法:
- Promise.then(onFulfilled,onRejected):Promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致.then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。
- Promise.all([p1,p2,p3]), 该方法用于将多个Promise实例,包装成一个新的Promise实例(Promise.all 方法的参数不一定是数组,但是必须具有 iterator 接口,且返回的每个成员都是 Promise 实例)
var p =promise.all([p1,p2,p3])的状态由p1,p2,p3决定,分成两种情况:
- 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
- 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
- Promise.race([p1,p2,p3]), 该方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
var p = Promise.race([p1,p2,p3]),只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的返回值。
- Promise.resolve(),该方法是将现有对象转为Promise对象。
如果 Promise.resolve 方法的参数,不是具有 then 方法的对象(又称 thenable 对象),则返回一个新的 Promise 对象,且它的状态为fulfilled;如果Promise.resolve方法的参数是一个Promise对象的实例,则会被原封不动地返回。
- Promise.reject(),该方法返回一个状态为rejected的Promise对象
Promise.reject方法的参数reason,会被传递给实例的回调函数。