const p = new Promise((resolve, reject) => {
console.log('create new promise');
try { //异步执行
this.ljccc(); //未定义,抛出异常,转而执行reject
} catch (err) {
reject('error');
}
});
console.log('after new promise');
p.then((value) => {
console.log(value);
}).catch((err) => {
console.log(err); //获取上面reject中的error,并打印出来。
});
上面的执行结果是:
create new promise
after new promise
error --------异步执行reject
const p = new Promise((resolve, reject) => {
console.log('create new promise');
try { //异步执行
resolve('success');
} catch (err) {
reject('error');
}
});
console.log('after new promise');
p.then((value) => {
console.log(value); //获取上面resolve中的success,并打印出来
}).catch((err) => {
console.log(err);
});
上面的执行结果是:
create new promise
after new promise
success --------异步执行resolve
所谓Promise,字面上可以理解为“承诺”,就是说A调用B,B返回一个“承诺”给A,然后A就可以在写计划的时候这么写:当B返回结果给我的时候,A执行方案S1,反之如果B因为什么原因没有给到A想要的结果,那么A执行应急方案S2,这样一来,所有的潜在风险都在A的可控范围之内了。
Promise规范如下:
- 一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
- 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
- promise必须实现
then
方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致 - then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用。同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象。
Promise实现的大致原理思路如下:
构造函数Promise接受一个函数resolver
,可以理解为传入一个异步任务,resolver接受两个参数,一个是成功时的回调,一个是失败时的回调,这两参数和通过then传入的参数是对等的。
其次是then的实现,由于Promise要求then必须返回一个promise,所以在then调用的时候会新生成一个promise,挂在当前promise的_next上,同一个promise多次调用都只会返回之前生成的_next。
由于then方法接受的两个参数都是可选的,而且类型也没限制,可以是函数,也可以是一个具体的值,还可以是另一个promise。