这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
Promise 是一个对象,它代表了一个异步操作的最终完成或者失败。简单来说我们可以用它来处理异步操作。
期约有三种状态,待定(pending)解决(resolve)拒绝(rejected)。通俗来说就是我们谈事情,事情没有签订合同前叫待定,签订合同后叫兑现,还有就是双方可能有各种原因没签上合同,这个就叫做拒绝。
我们应该明确一点就是resolve和rejected是相悖的,它的状态只能改变一次,在确定执行后也不能通过调用相悖的方法来改变。
let p = new Promise((resolve, reject) => {
setTimeout(reject, 10000);//10秒后调用reject()
})
setTimeout(console.log,0,p);//Promise {<pending>}
setTimeout(console.log,11000,p)//Promise {<rejected>: undefined}
如果执行器中的代码在超时前解决或者拒绝,那么超时回调再尝试拒绝也只能失败。
function onResolved(id) {
setTimeout(console.log,0,id,'resolved')
}
function onRejected(id) {
setTimeout(console.log,0,id,'rejected')
}
let p1 = new Promise((resolved, rejected) => setTimeout(resolve, 2000));
let p2 = new Promise((resolved, rejected) => setTimeout(resolve,2000));
p1.then(()=>onResolved('p1'),()=> onRejected('p1'));
p2.then(()=> onRejected('p2'),()=>onResolved('p2'));
再次强调一下期约的只能转换为最终状态一次,我们运行了俩次,但它只执行第一次。
传给then的任何非函数类型的参数都会被忽略,如果只想提供onRejected参数,那么只需要将对应的参数传入undefined就好了。
let p = Promise.reject();
let onRejected = function(e) {
setTimeout(console.log,0,'jackson');
}
p.then(null,onRejected);//jackson
p.catch(onRejected);//jackson
let p1 = Promise.resolve('jackson');
let p2 = p1.finally(); //Promise <resolved> jackson
let p3 = p1.finally(()=>'bear')//Promise <resolved> jackson
如果返回的是一个待定期约或者处理程序错误,则会返回相应的期约(待定或拒绝)。
// 期约连锁
let p = new Promise((resolve, reject)=>{
console.log('jackson');
resolve();
})
p.then(()=> console.log('bear'))
.then(()=>console.log('jackson11'))
.then(()=>console.log('jackson22'));
// 期约合成
function add2(x) {
return x + 2;
}
function add3(x) {
return x + 3;
}
function add4(x) {
return x + 4;
}
function add10(x){
return Promise.resolve(x)
.then(add2)
.then(add3)
.then(add4);
}
add10(10).then(console.log)