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

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(nullfunction (s){  
    console.log(s) 
}); // 出错了

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

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


1.参数是一个Promise实例

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

2.参数是一个thenable对象

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

let thenable = {
 thenfunction(resolve, reject){
        resolve("ok")
    }
}

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

let thenable = {
 thenfunction(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")
})


原文始发于微信公众号(豆子前端):面试官:根据promiseA+规范,promise.resolve(obj)中obj有几种可能?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/56831.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!