有时需要将现有对象转为 Promise 对象,Promise.resolve()方法就起到这个作用。
http://es6.ruanyifeng.com/#docs/promise#Promise-resolve

一、前言

复习Promise时,发现Promise.resolve()这个方法,于是研究了一下。

二、定义

Promise.resolve(value)方法返回一个以给定值解析后的Promise对象。

1、如果该值为promise,返回这个promise:

let p = new Promise(resolve=>{});
Promise.resolve(p) === p; // true

2、如果这个值是thenable对象(就是一个带有then方法的对象),返回的promise会立即执行这个thenable对象then方法:

let p = Promise.resolve({
    then: function(resolve, reject) { resolve("resolved!"); }
});

p.then(value => { console.log(value); }); // resolved

3、如果这个值不是对象,比如字符串、数字,Promise.resolve会返回一个状态为resolved的新的Promise对象:

let p = Promise.resolve('123');
p.then(value => { console.log(value); }); // 123

4、此函数会将类promise对象的多层嵌套展平

p1 = Promise.resolve('123')
// Promise {<resolved>: "123"}
p2 = Promise.resolve(p1);
// Promise {<resolved>: "123"}
p3 = Promise.resolve(p2);
// Promise {<resolved>: "123"}
p3.then(value=>{console.log(value)})
// 123
p1 === p2;
// true
p2 === p3
// true

三、用处

目前发现了两个用处。

1、改变执行顺序。

Promise.then属于微任务。微任务将会插入当前事件循环的末尾,而如果一直插入微任务,下一个宏任务就不会开始执行。这和setTimeout不同,setTimeout会在下一个事件循环的开始执行。

2、“当你的数据不是promise实例,或者你不知道它是不是promise,而你又想把它当做promise实例来使用的时候”。

https://segmentfault.com/q/1010000020940414?_ea=23440698
感谢回答者

例子:

Promise.resolve(data ? data : getData()).then(...)

End

标签: JavaScript, Promise

添加新评论