特点
- 不受外界影响
有三种状态: pending(进行中) fulfiled(已成功) rejected(已失败)。
只有异步的结果可以决定当前转台,其他操作都无法改变状态。
- 一旦改变状态,就不会再变,任何时候都可以得到这个结果
改变状态只有两种方向:pending->fulfilled; pending->rejected
缺点
- 一旦创建会立即执行,无法中途取消
- 如果不设置回调函数,内部会抛出错误,不会反应到外部。
- 处于pending状态时,无法得知目前进展到哪一个阶段
基本用法
ES6规定promiese是一个构造函数,用来生成Promise实例
- 下面代码创造了一个Promise实例
const promise = new Promise(function(resolve,reject){
//some code (立即执行)
if(/*异步操作成功*/){
resolve(value)
} else {
reject(error)
}
})
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。
- Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
promise.then(function(value){
//success
},function(error){
//failure
});
Promise.prototype.then()
采用链式的then,可以指定一次按照次序调用的回调函数,前一个回调函数,有可能返回的还是一个Promise对象(即有异步操作),这时 后一个回调函数,就会等待该Promise对象状态改变,才会被调用。
getJson("/post.json").then(
post=>getJson(post.commenURL)
).then(
comments => console.log("resolve:",comments)
err => console.log("rejected:",err)
)
Promise.prototype.catch()
p.then((val) => console.log('fulfilled:', val))
.catch((err) => console.log('rejected', err));
// 等同于
p.then((val) => console.log('fulfilled:', val))
.then(null, (err) => console.log("rejected:", err));
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。
一般来说,不要在then方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法。
// bad
promise
.then(function(data) {
// success
}, function(err) {
// error
});
// good
promise
.then(function(data) { //cb
// success
})
.catch(function(err) {
// error
});
Promise.prototype.finally()
finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。
promise
.then(result => {...})
.catch(error => {...})
.finally(() => {...})
对于不论结果如何都要执行的方法,如果不使用finally方法,同样的语句需要为成功和失败两种情况各写一次。有了finally方法,则只需要写一次。
promise
.finally(() => {
// 语句
});
// 等同于
promise
.then(
result => {
// 语句
return result;
},
error => {
// 语句
throw error;
}
);
Promise.all()
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
- 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
- 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise.race()
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。