【问题标题】:Is it impossible to get the [[PromiseValue]] from a Promise object without using the Promise object's then method? [duplicate]不使用 Promise 对象的 then 方法就无法从 Promise 对象中获取 [[PromiseValue]] 吗? [复制]
【发布时间】:2017-05-03 06:02:24
【问题描述】:

此问题旨在成为规范问题/答案;见What is a canonical question/answer, and what is their purpose?。没有明确的答案,在这里。代替先前提出并回答的问题,我在此处发布问题。如果问题已经回答,将删除当前问题。


Promises/A+ 规范位于 point-2 状态

promise 表示异步的最终结果 手术。与 Promise 交互的主要方式是通过 它的then 方法,它注册回调以接收一个 承诺的最终价值或承诺不能成为的原因 完成了。

comment 这个问题return value from Promise OP 询问

是的,但这是否会从承诺中剔除价值,或者应该 我接受浏览器不可能做到这一点?

回复了

犹豫说什么是“不可能的”。

然后提供规范链接,PromisesYou're Missing the Point of Promises


不使用Promise对象的then方法,除了在console.log(promiseObject)查看对象的属性值之外,是不是不可能从Promise对象中获取[[PromiseValue]]

【问题讨论】:

  • 没有什么可说的,承诺如何存储 PromiseResult,我相信,这取决于实施。它可以存储为外部代理可以直接访问的可公开访问的属性(假设他们有其他方式知道承诺已经实现)。但是,由于除了.then() 之外没有其他标准方法可以知道何时履行承诺并在那里提供结果,因此尝试以任何其他方式访问该值似乎没有意义。
  • 而且,我看到的所有其他关于尝试直接访问承诺值的问题都来自那些不了解价值何时可用以及你如何拥有的整个未来时间问题的人无论如何都要使用.then() 来知道该值何时可用。因此,如果您使用.then() 来知道它何时可用,那么您最好只使用.then() 提供它时的值。
  • 简短回答:不,目前在浏览器中不可行,将来检查ES7 async await,以及learn how bad async await actually is 以及为什么它可能无法在浏览器中实现。顺便说一句,您为什么要尝试使一个是/否问题成为规范?
  • 总结是没有直接检索[[PromiseValue]] 的标准方法,而询问这个问题通常是由于对时间的误解。是否存在非标准方式完全取决于实现,以及它是否在这方面提供了超出 Promise 标准的标准 Javascript 的东西。因此,是否不可能取决于 Promise 的实现。
  • @Bergi 不确定为什么在创建问题标题时该问题没有出现。为此目的包括[[PromiseValue]],以避免创建重复的问题。已作为您共享的链接的副本关闭。

标签: javascript promise


【解决方案1】:

在 ES7 中不可能。 Promise 的值存储在[[PromiseResult]] internal slot:

承诺已被履行或拒绝的值,如果 任何。仅当 [[PromiseState]] 不是 "pending" 时才有意义。

该槽仅在PerformPromiseThen抽象操作中读取,该操作仅通过Promise.prototype.then公开。

【讨论】:

  • 刚刚发生如果console.log(Promise.resolve("a value")) 打印Promiseconsole 的内部插槽,是否可以检索console.log() 调用的结果,如果只是作为文本?
  • @guest271314 也许你有像扩展这样的特权代码,否则我不这么认为。
猜你喜欢
  • 2018-07-07
  • 2016-09-01
  • 1970-01-01
  • 2015-02-20
  • 2023-03-26
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多