乐趣区

Promiseresolve详解

Promise.resolve 等价于下面的写法

有时需要将现有对象转为 Promise 对象,Promise.resolve 方法就起到这个作用。

Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))

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);  // 42
});

thenable 对象的 then 方法执行后,对象 p1 的状态就变为 resolved,从而立即执行最后那个 then 方法指定的回调函数,输出 42

参数不是具有 then 方法的对象,或根本就不是对象

如果参数是一个原始值,或者是一个不具有 then 方法的对象,则 Promise.resolve 方法返回一个 新的 Promise 对象,状态为 resolved。

const p = Promise.resolve('Hello');

p.then(function (s){console.log(s)
});
// Hello

由于字符串 Hello 不属于异步操作(判断方法是字符串对象不具有 then 方法),返回 Promise 实例的状态从一生成就是 resolved,所以回调函数会执行。Promise.resolve 方法的参数,会同时传给回调函数

不带有任何参数

Promise.resolve 方法允许调用时不带参数,直接返回一个 resolved 状态的 Promise 对象。

setTimeout(function () {console.log('three');
}, 0);

Promise.resolve().then(function () {console.log('two');
});

console.log('one');

// one
// two
// three

.then()函数里不返回值或者返回的不是 promise,那么 then 返回的 Promise 将会成为接受状态(resolve)

Promise.resolve().then(() => console.log(2)).then(() => console.log(3));
console.log(1); // 1, 2, 3

需要注意的是,立即 resolve 的 Promise 对象,是在本轮“事件循环”(event loop)的结束时执行执行,不是马上执行, 也不是在下一轮“事件循环”的开始时执行
原因:传递到 then() 中的函数被置入了一个微任务队列,而不是立即执行,这意味着它是在 JavaScript 事件队列的所有运行时结束了,事件队列被清空之后,才开始执行

resolve()本质作用

  • resolve()是用来表示 promise 的状态为 fullfilled,相当于只是定义了一个有状态的 Promise,但是并没有调用它;
  • promise 调用 then 的前提是 promise 的状态为 fullfilled;
  • 只有 promise 调用 then 的时候,then 里面的函数才会被推入微任务中;
退出移动版