有时需要将现有对象转为 Promise 对象,solve⽅法就起到这个作⽤。
// 等价于
new Promise(resolve => resolve('foo'))
参数是⼀个 Promise 实例
如果参数是 Promise 实例,那么solve将不做任何修改、原封不动地返回这个实例。
参数是⼀个thenable对象
thenable对象指的是具有then⽅法的对象,⽐如下⾯这个对象
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
};
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
};
let p1 = solve(thenable);
p1.then(function(value) {
console.log(value); // 42
});
thenable对象的then⽅法执⾏后,对象p1的状态就变为resolved,从⽽⽴即执⾏最后那个then⽅法指定的回调函数,输出 42resolved是什么状态
参数不是具有then⽅法的对象,或根本就不是对象
如果参数是⼀个原始值,或者是⼀个不具有then⽅法的对象,则solve⽅法返回⼀个新的 Promise 对象,状态为resolved。const p = solve('Hello');
p.then(function (s){
console.log(s)
});
// Hello
由于字符串Hello不属于异步操作(判断⽅法是字符串对象不具有 then ⽅法),返回 Promise 实例的状态从⼀⽣成就是resolved,所以回调函数会执⾏。solve⽅法的参数,会同时传给回调函数
不带有任何参数
setTimeout(function () {
console.log('three');
}, 0);
console.log('two');
});
console.log('one');
// one
// two
// three
.then()函数⾥不返回值或者返回的不是promise,那么 then 返回的 Promise 将会成为接受状态(resolve)
console.log(1); // 1, 2, 3
需要注意的是,⽴即resolve的 Promise 对象,是在本轮“事件循环”(event loop)的结束时执⾏执⾏,不是马上执⾏,也不是在下⼀轮“事件循环”的开始时执⾏
原因:传递到 then() 中的函数被置⼊了⼀个微任务队列,⽽不是⽴即执⾏,这意味着它是在 JavaScript 事件队列的所有运⾏时结束了,事件队列被清空之后,才开始执⾏
resolve()本质作⽤
resolve()是⽤来表⽰promise的状态为fullfilled,相当于只是定义了⼀个有状态的Promise,但是并没有调⽤它;
promise调⽤then的前提是promise的状态为fullfilled;
只有promise调⽤then的时候,then⾥⾯的函数才会被推⼊微任务中;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论