javascript基础学习系列四百九十七:Promise.resolve()

期约并非一开始就必须处于待定状态,然后通过执行器函数才能转换为落定状态。通过调用
Promise.resolve()静态方法,可以实例化一个解决的期约。下面两个期约实例实际上是一样的:
let p1 = new Promise((resolve, reject) => resolve());
let p2 = Promise.resolve();
这个解决的期约的值对应着传给Promise.resolve()的第一个参数。使用这个静态方法,实际上
可以把任何值都转换为一个期约:
setTimeout(console.log, 0, Promise.resolve());
// Promise : undefined
setTimeout(console.log, 0, Promise.resolve(3));
// Promise : 3
// 多余的参数会忽略
setTimeout(console.log, 0, Promise.resolve(4, 5, 6));
// Promise : 4
对这个静态方法而言,如果传入的参数本身是一个期约,那它的行为就类似于一个空包装。因此,
Promise.resolve()可以说是一个幂等方法,如下所示:
let p = Promise.resolve(7);
setTimeout(console.log, 0, p === Promise.resolve§);
// true
setTimeout(console.log, 0, p === Promise.resolve(Promise.resolve§));
// true
这个幂等性会保留传入期约的状态:
let p = new Promise(() => {});
setTimeout(console.log, 0, p); // Promise
setTimeout(console.log, 0, Promise.resolve§); // Promise
setTimeout(console.log, 0, p === Promise.resolve§); // true
注意,这个静态方法能够包装任何非期约值,包括错误对象,并将其转换为解决的期约。因此,也
可能导致不符合预期的行为:
let p = Promise.resolve(new Error(‘foo’));
setTimeout(console.log, 0, p);
// Promise : Error: foo
Promise.reject()
与Promise.resolve()类似,Promise.reject()会实例化一个拒绝的期约并抛出一个异步错误
(这个错误不能通过try/catch 捕获,而只能通过拒绝处理程序捕获)。下面的两个期约实例实际上是
一样的:
let p1 = new Promise((resolve, reject) => reject());
let p2 = Promise.reject();
这个拒绝的期约的理由就是传给Promise.reject()的第一个参数。这个参数也会传给后续的拒
绝处理程序:
let p = Promise.reject(3);
setTimeout(console.log, 0, p); // Promise : 3
p.then(null, (e) => setTimeout(console.log, 0, e)); // 3
关键在于,Promise.reject()并没有照搬Promise.resolve()的幂等逻辑。如果给它传一个期
约对象,则这个期约会成为它返回的拒绝期约的理由:
setTimeout(console.log, 0, Promise.reject(Promise.resolve()));
// Promise : Promise

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值