javascript - 解析函数是否传递给 Promise 执行器异步?

标签 javascript node.js promise

我有以下代码:

function myPromiseFunc() {
  return new Promise((resolve) => {
    resolve(Promise.resolve(123));
  });
}
据我们所知Promise.resolve方法立即使用普通值解析 Promise。
所以Promise.resolve(123) -> Promise<fulfilled>但:
console.log(myPromiseFunc());
将返回状态为 pending 的 Promise .为什么? 解析函数是否传递给执行器异步? 原因如下:
setTimeout(console.log, 0, res);
将返回 Promise<fulfilled> .
我知道 Promises 使用微任务,但它应该只用于处理程序。
Promises/A+说:
[[解决]](promise, x) -> If/when x is a promise and fulfilled, fulfill promise with the same value.顺便一提。此剪辑将返回 Promise<fulfilled> :
function myPromiseFunc() {
  return new Promise((resolve) => {
    resolve(123);
  });
}
所以它看起来像 resolve仅当 Promise 作为值传递时才异步。
请帮助理解。谢谢!

最佳答案

根据the specificationresolvenew Promise((resolve, reject) => ...) 中传递给执行器的函数:
当使用参数 resolution 调用 promise 解析函数时,采取以下步骤:

  • F是事件的功能对象。
  • 断言:F有一个 [[Promise]]值为 Object 的内部插槽。
  • promiseF.[[Promise]] .
  • alreadyResolvedF.[[AlreadyResolved]] .
  • 如果 alreadyResolved.[[Value]]true , 返回 undefined .
  • 设置 alreadyResolved.[[Value]]true .
  • 如果 SameValue(resolution, promise)true , 然后
  • selfResolutionError做个新人TypeError目的。
  • 返回 RejectPromise(promise, selfResolutionError) .

  • 如果 Type(resolution)不是对象,那么
  • 返回 FulfillPromise(promise, resolution) .

  • thenGet(resolution, "then") .
  • 如果 then是突然完成,那么
  • 返回 RejectPromise(promise, then.[[Value]]) .

  • thenActionthen.[[Value]] .
  • 如果 IsCallable(thenAction)false , 然后
  • 返回 FulfillPromise(promise, resolution) .

  • thenJobCallbackHostMakeJobCallback(thenAction) .
  • jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback) .
  • 执行HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]]) .
  • 返回 undefined .

  • 很多技术术语,但对您的问题来说最重要的一点是 resolution是您传递给它的值。如果它(大致)是一个非 Promise,你最终会出现在 8.1 中。 (对于非对象)或 12.1 (对于不可调用的对象),这将立即履行 promise 。如果你传递了一个带有 then 的值函数(例如 Promise),它将执行从 13 开始的所有步骤它基本上排队.then并遵循整个“我的实现取决于另一个 Promise 的实现”。

    关于javascript - 解析函数是否传递给 Promise 执行器异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68704448/

    相关文章:

    javascript - jsdoc 别名方法名

    javascript - 你需要 python 来使用 casper.js 吗?如果是,为什么?

    javascript - AngularJs - ngRepeat 需要很长时间才能显示数据

    node.js - 没有定义require怎么解决?

    javascript - AngularJS $q.resolve()、ES6 Promise.resolve()(和其他动物)

    javascript - 如何使用 Knockout JS 添加类?

    javascript - 我想在 POST 命令中发送一些内容,而不需要用户在 Javascript 中输入该值

    javascript - Node.js:如何在服务器崩溃时得到警告

    javascript - .getScript() 回调可多次使用

    javascript - Angular 中的过滤和 $http promise