Promise.resolve()
函数 的最简洁方法 履行承诺 包含给定值,例如假设你想创建一个用字符串 Hello, World 实现的 Promise:
const p = Promise.resolve(Hello, World);
const str = await p;
str; // Hello, World
return p.then(str => {
str; // Hello, World
});
Resolved is Not the Same as Fulfilled
他们之间的区别 Resolved 的 Promise 和已 fulfilled 是一个常见的 JavaScript 面试问题,区别很微妙,但很重要。
关键的区别在于当一个 Promise 被另一个 Promise 解决时会发生什么。你调用 Promise.resolve(p)
, 在哪里 p
是一个承诺,你创造了一个新的承诺,它与 p
,如果 p
履行,返回的承诺以相同的价值履行。如果 p
被拒绝,返回的 Promise 以相同的值被拒绝,Promises/A+ 规范将此过程称为同化 。
const p = Promise.resolve(Hello, World);
const p2 = Promise.resolve(p);
const str = await p2;
// `p2` assimilates the value of `p`.
str; // Hello, World
一个被解析为另一个 Promise 的 Promise 仍处于未决状态。特别是,一个已解决的承诺仍然可能被拒绝!
async function fail() {
await new Promise(resolve => setTimeout(resolve, 100));
throw new Error(Oops);
}
// Calling `fail()` returns a promise that rejects after
// 100ms. So `p` will reject, even though it was resolved!
const p = Promise.resolve(fail());
const err = await p.catch(err => err);
err.message; // Oops
Resolved 不是 Promise 的 状态 。 另一方面,已完成是 Promise 可以处于的 3 种状态之一,一旦 Promise 转换为已完成,JavaScript 就会执行任何 onFulfilled
您传递给 then()
函数。
使用 Promise 构造函数
当您使用 new
,你调用 Promise 构造函数 。Promise 构造函数接受一个参数,一个 executor
功能。Promise 构造函数然后执行 executor
具有 2 个参数的函数: resolve()
和 reject()
。
function executor(resolve, reject) {
typeof resolve; // function
typeof reject; // function
}
new Promise(executor);
请注意,通常调用第一个参数 resolve()
, 不是 fulfill
,那是因为 resolve()
Promise 构造函数中的函数的行为很像 Promise.resolve()
, 你调用 resolve()
有了一个 Promise,你就同化了那个 Promise 的值。
const p = Promise.resolve(Hello, World);
const p2 = new Promise(resolve => resolve(p));
const str = await p2;
// `p2` assimilates the value of `p`.
str; // Hello, World
请登录后查看评论内容