三种状态
- pending:进行中
- fulfilled:已成功
- rejected:已失败
只能从pending到fulfilled或者pending到rejected
一旦状态改变,就不会再变,任何时候都可以得到这个结果。
基本用法
创造了一个Promise实例
resolve:是一个函数,将Promise对象的状态从“未完成”变为“成功”
reject:也是函数,将Promise对象的状态从“未完成”变为“失败”
const promise=new Promise((resolve,reject)=>{
if (/*操作成功*/) {
resolve(value)
} else {
reject(error)
}
});
then方法
promise.then(function(value) {
//状态变成fulfilled的回调
}, function(error) {
// 状态变成reject的回调,可有可无
});
箭头函数形式
promise.then((value)=>{
},
(value)=>{
});
实例
function timeout(ms){
return new Promise((resolve,reject)=>{
setTimeout(resolve,ms,'done')
})
}
timeout(100).then((value)=>{
console.log(value)//done
})
timeout采用了函数的尾调用,不懂的可以去http://es6.ruanyifeng.com/#docs/function#尾调用优化查看
timeout 返回一个promise实例,在100ms后状态从pending变成resolved,输出done这个值
Promise 新建后就会立即执行。
参数
resolve:Promise 实例/数值
reject:错误实例
resolve参数例子
const one=new Promise((resolve,reject)=>{
})
const two=new Promise((resolve,reject)=>{
resolve(one)
})
调用resolve或reject以后,Promise 的使命就完成了,后继操作应该放到then方法里面
所以应该在resolve前面加上return
return resolve()
Promise.prototype.then()
then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数
Promise.prototype.catch()
用于指定发生错误时的回调函数
p.then((val) => console.log('fulfilled:', val))
.catch((err) => console.log('rejected', err));
Promise.prototype.finally()
不管promise最后的状态,在执行完then或catch指定的回调函数以后,都会执行finally方法指定的回调函数
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
Promise.all()
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
const p = Promise.all([p1, p2, p3]);
p1,p2,p3都是promise实例
p的状态由p1、p2、p3决定
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
// 生成一个Promise对象的数组
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON('/post/' + id + ".json");
});
Promise.all(promises).then(function (posts) {
// ...
}).catch(function(reason){
// ...
});
Promise.race()
Promise.race方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
const p = Promise.race([p1, p2, p3]);
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。