Promise.resolve
Promise.resolve()
方法返回一个以给定值解析后的 Promise 对象。
语法
语法:
Promise.resolve(value);
类型声明:
interface PromiseConstructor {
resolve(): Promise<void>;
resolve<T>(value: T | PromiseLike<T>): Promise<T>;
}
参数说明:
参数 | 说明 | 类型 |
---|---|---|
value | 见下方 | any |
根据传入参数的不同,会有不同的响应效果。
- Promise 实例:返回传入的 Promise 实例
- Thenable 对象:将该 Thenable 对象转化为 Promise 对象,然后立即执行
.then()
方法 - 非 Thenable 对象:返回新的 Fulfilled 状态的 Promise 实例
- 不带参数:返回新的 Fulfilled 状态的 Promise 实例
Promise 实例
如果参数是 Promise 实例,那么 Promise.resolve
将不做任何修改、原封不动地返回这个实例。
Thenable 对象
thenable
对象指的是具有 then
方法的对象,比如下面这个对象。
let thenable = {
then: (resolve, reject) => resolve(100),
};
Promise.resolve
方法会将这个对象转为 Promise 对象,然后就立即执行 thenable
对象的 .then()
方法。
let thenable = {
then: (resolve, reject) => resolve(100),
};
let promise = Promise.resolve(thenable);
promise.then((value) => console.log(value)); // 100
上述代码中,当 thenable
对象的 then
方法执行后,对象 promise
的状态就变为 Fulfilled,从而立即执行最后那个 .then()
方法指定的回调函数。
非 Thenable 对象
如果参数是一个原始值,或者是一个不具有 then
方法的对象,则 Promise.resolve
方法返回一个新的 Promise 对象,状态为 Fulfilled。
const promise = Promise.resolve('Hello');
promise.then((v) => console.log(v));
// 'Hello'
由于传入 Promise.resolve
方法的参数非具有 then
方法的对象,因此判断该参数不属于异步操作,返回状态为 Resolve 的 Promise 实例,并且立即执行回调函数。Promise.resolve
方法的参数,会同时传给回调函数。
不带参数
Promise.resolve
方法允许调用时不带参数,直接返回一个 Fulfilled 状态的 Promise 对象。
如果希望得到一个 Promise 对象,比较方便的方法就是直接调用 Promise.resolve
方法。
需要注意的是,状态为 Fulfilled 的 Promise 对象,是在本轮 事件循环(Event Loop)的结束时,而不是在下一轮事件循环的开始时。
代码示例
基本用法
Promise.resolve(value)
可以认为是 new Promise()
的快捷方式。返回的 Promise 对象将立即进入 Fulfilled 状态。
Promise.resolve('Fulfilled').then(
(res) => {
console.log(res); // 'Fulfilled'
},
(rej) => {
console.log(rej); // 不会调用
}
);
数组作参数
如果传入的参数为数组,则参数为非 Thenable 对象,会返回新的 Fulfilled 状态的 Promise 实例。
const promise = Promise.resolve([0, 1, 2]);
promise.then((v) => {
console.log(v[0]); // 0
});
Promise 作为参数
如果传入的参数为 Promise 的实例对象,那么会直接返回该 Promise 的实力对象。
const foo = new Promise('foo');
const bar = Promise.resolve(foo);
bar.then((value) => {
console.log(value);
// 2. 输出: 'foo'
});
console.log(foo === bar);
// 1. 输出: true
// 这里有同步异步先后执行的区别