从零开始学_JavaScript_系列(51)——Promise(4)Promise.resolve和Promise.reject

9、Promise.resolve

Promise.resolve(value);

Promise.resolve(promise);

Promise.resolve(thenable);

参数与返回值:

  1. 参数是promise对象:返回值是参数,不做任何改变;
  2. 参数是thenable:指是一个有then属性的对象,返回值是一个新建的Promise对象,相当于将then方法作为创建时的参数使用;
  3. 参数是value:指不是以上两种情况,比如是一个字符串或者普通对象,返回一个状态是resolved的Promise对象,值是value

为了方便理解,Promise.resolve相当于以下代码:

function resolve(data) {
    // 当参数是Promise对象时
    if (Object.prototype.toString.call(data) === '[object Promise]') {
        return data;
    }
    // 当参数不是thenable时
    if (typeof data !== 'object' || typeof data.then !== 'function') {
        return new Promise(res => {
            res(data)
        })
    }
    // 当参数是thenable时
    return new Promise(data.then.bind(data))
}

情况一:参数是Promise对象

直接返回该Promise对象,不做任何操作

let foo = new Promise(res => res('foo'));
let bar = Promise.resolve(foo);
foo === bar;    //true
let baz = resolve(foo);
foo === baz;    //true

情况三:参数是value

let bar = new Promise(res => res("bar"))
bar.then(msg => console.log(msg))
let foo = Promise.resolve('foo')
foo.then(msg => console.log(msg))
let res = resolve('res')
res.then(msg => console.log(msg))
let baz = new Promise(res => res("baz"))
baz.then(msg => console.log(msg))
// bar
// foo
// res
// baz

情况二:参数是thenable

这个情况看起来,但细节比较多,理解起来会有点费劲。

首先,对象的then方法被作为一个新的Promise对象的参数使用;

其次,该方法的this被默认指向了对象本身。

如果在resolve里不将this通过bind绑定给data的话,那么在执行的时候,this会指向window。原因是new Promise的时候,会改变新建对象的this指向目标,而Promise对象的this指向的是window

第三,如果在then方法里,状态改变之前抛错,那么会触发reject回调函数,而不是resolve。原因跟new Promise的参数里抛错会执行reject是一个道理

第四,假如在then方法中,最终执行了第二个参数reject,而不是resolve,那么最终状态也会变为rejected。

示例代码:

let foo = {
    then(res, rej){
        res('123')
    }
}
Promise.resolve(foo).then(msg => console.log(msg))
resolve(foo).then(msg => console.log(msg))
// 123
// 123

Promise.reject

跟Promise.resolve没啥区别,除了在非thenable情况下,状态会默认变为rejected之外。

所以参考上面的Promise.reject即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值