面试官:根据promiseA+规范,promise.resolve(obj)中obj有几种可能?


菜鸟教程之promise

tips:阅读本文之前,应该对promise有初步的认识和了解。

Promise.resolve 方法,Promise.reject 方法

有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用。

var jsPromise = Promise.resolve($.ajax('/whatever.json'));

上面代码将 jQuery 生成 deferred 对象,转为一个新的 ES6 的 Promise 对象。

如果 Promise.resolve 方法的参数,不是具有 then 方法的对象(又称 thenable 对象),则返回一个新的 Promise 对象,且它的状态为fulfilled。

var p = Promise.resolve('Hello'); 
p.then(function (s){  console.log(s) }); // Hello

上面代码生成一个新的Promise对象的实例p,它的状态为fulfilled,所以回调函数会立即执行,Promise.resolve方法的参数就是回调函数的参数。

如果Promise.resolve方法的参数是一个Promise对象的实例,则会被原封不动地返回。

Promise.reject(reason)方法也会返回一个新的Promise实例,该实例的状态为rejected。Promise.reject方法的参数reason,会被传递给实例的回调函数。

var p = Promise.reject('出错了');  
p.then(null, function (s){  
    console.log(s) 
}); // 出错了

上面代码生成一个Promise对象的实例,状态为rejected,回调函数会立即执行。

总结一下:Promise.resolve方法的参数分为四种情况


1.参数是一个Promise实例

如果参数是Promise实例,那么Promise.resolve将不做任何修改,原封不动地返回这个实例。

2.参数是一个thenable对象

thenable对象指的是具有then方法的对象,比如下面这个对象。

let thenable = {
	then: function(resolve, reject){
        resolve("ok")
    }
}

Promise.resolve方法会将这个对彖转为Promise对象,然后立即执行thenable对象的then方法。返回的promise会“跟随”这个thenable的对象,采用它的最终状态;

let thenable = {
	then: function(resolve, reject){
        console.log("thenable被执行")
        resolve("ok")
    }
}


let p = Promise.resolve(thenable);

p.then((res)=>{
    console.log(res); // ok
})

3.参数不是具有then方法的对象或根本不是对象

如果参数是一个原始值,或者是一个不具有then方法的对象,那么Promise.resolve方法返回一个新的Promise对象,状态为Resolved。

let p = Promise.resolve("ok")
p.then(res=>{
	console.log(res); // ok
});

4.不带有任何参数

Promise.resolve方法允许在调用时不带有任何参数,而直
接返回一个Resolved状态的Promise对象。

let p = Promise.resolve();
p.then(()=>{
	console.log("ok")
})
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值