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")
})
原文始发于微信公众号(豆子前端):面试官:根据promiseA+规范,promise.resolve(obj)中obj有几种可能?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/56831.html