您的位置:首页 > Web前端 > JavaScript

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

2017-07-28 10:11 477 查看

9、Promise.resolve

Promise.resolve(value);

Promise.resolve(promise);

Promise.resolve(thenable);

参数与返回值:

参数是promise对象:返回值是参数,不做任何改变;

参数是thenable:指是一个有then属性的对象,返回值是一个新建的Promise对象,相当于将then方法作为创建时的参数使用;

参数是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即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐