有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用。
Promise.resolve方法的参数可以分成以下四种情况:
- 参数是一个Promise实例
如果参数是Promise实例,那么Promise.resolve将不做任何修改,原封不动地返回这个实例。
- 参数是一个thenable对象
thenable对象指的是具有then方法的对象,比如下面这个对象。
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
} ;
Promise.resolve方法会将这个对象转为Promise对象,然后立即执行thenable对象的then方法。
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
} ;
let p1 = Promise.resolve(thenable);
p1.then(function(value) {
console.log(value)
});
上面的代码种,thenable对象的then方法执行后,对象p1的状态就变为resolved,从而立即执行最后的then方法指定的回调函数,输出42。
- 参数不是具有then方法的对象或根本不是对象
如果参数是一个原始值,或者是一个不具有then方法的对象,那么Promise.resolve方法返回一个新的Promise对象,状态为Resolved。
var p = Promise.resolve('Hello')
p.then(function(s) {
console.log(s);
});
- 不带有任何参数
Promise.resolve方法允许在调用时不带有任何参数,而直接返回一个Resolved状态的Promise对象。
var p = Promise.resolve()
p.then(function() {
//...
})
需要注意的是,立即resolve的Promise对象是在本轮“事件循环”结束时,而不是在下一轮“事件循环”开始时。
<script>
setTimeout(function() {
console.log('three')
}, 0)
Promise.resolve().then(function() {
console.log('two')
})
console.log('one')
</script>
上面的代码中,setTimeout(fn, 0)是在下一轮“事件循环”开始时执行的,Promise.resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行。