在 JavaScript 中 Resolved 一个 Promise

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
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容