【问题标题】:Why promise's executor function arg named resolve()?为什么 promise 的执行函数 arg 命名为 resolve()?
【发布时间】:2018-02-01 06:32:24
【问题描述】:

在我阅读的几乎所有文档中,promise 都是用一个执行器函数构造的,它的第一个参数是一个名为“resolve”的函数:

var promise1 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

但对我来说,这非常令人困惑,因为 Promise 术语将“已解决”与“已实现”区分开来,并且在 executor 函数命名中并没有始终如一地观察到这种区别。

根据https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md 和https://promisesaplus.com/,“已解决”意味着承诺已进入某种最终状态(履行、拒绝或解决为另一个承诺),“履行”意味着承诺已成功解决。

但是,执行器的 resolve() 函数用于强制承诺进入“已完成”状态。

所以我的问题是:为什么执行器的resolve() 函数不命名为fulfill()?我是不是误会了什么?

【问题讨论】:

  • 您可以随意命名。这是您自己的参数声明。如果fulfill 对您来说听起来更好,那么请继续使用它。
  • 有道理,谢谢。是否有我遗漏的原因可以解释为什么所有引用似乎都将其命名为解析,如果满足显然会是一个更准确和一致的名称?
  • 那篇状态和命运文章与您的解释并不完全一致。它是这样说的:“它可以被解析为一个非承诺值,在这种情况下,它会用那个值来实现。”这是它使用resolve 作为动词,就像resolve() 调用一样。我一直认为完成和解决术语是一团糟。大多数人谈到解决或拒绝承诺。无论最初设计者对“实现”的目标是什么,这个目标似乎都失败了,因为大众使用 resolve 和 reject 作为两个动词来改变承诺的状态。
  • 明白了,promise 解析的递归性质解释了为什么 resolve() 不是 fully() 的同义词,为什么 resolve() 确实是更好的函数名称。谢谢!!
  • 该文档谈到“解析为一个值”或“解析为一个 thenable”。我猜它只是fulfilled 如果它被解析为一个值并且解析回调可以做到。

标签: javascript promise


【解决方案1】:

这是一种可能的解释。

一个承诺最终会被履行或被拒绝,它可以通过履行价值或拒绝理由直接发送到其中一个状态。

但是,promise 也可以绑定到另一个 thenable,然后它将跟踪该 thenable。如果那个thenable最终实现了,这个promise就会实现。如果其他 thenable 最终被拒绝,则此承诺将被拒绝。

所以,有了 executor,你实际上可以做三件事:

  1. 实现一个值(不是 thenable)。
  2. 拒绝理由
  3. 解析为将被跟踪的 thenable,其最终处置将由该 Promise 继承。

啊,但是你不需要三个函数来实现这一切。你可以只用两个。 #1 和 #3 可以使用相同的函数,只是改变传递给它的内容(thenable 或 non-thenable 值)。因此,您需要一个同时捕获#1 和#3 的动词。人们通常选择resolve 作为那个动词。它被解析为一个值或 thenable。

所以,你得到new Promise(function(resolve, reject) {...});。您必须为第一个功能选择一些词。大多数编写文档的人选择了resolve()。如果你解决了一个非 thenable 的值,你就会得到一个已履行的承诺。如果你解决了一个 thenable,这个 Promise 将跟踪那个 thenable 并呈现它的最终状态。

【讨论】:

  • @oregontrail256 - 这回答了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 2013-12-07
相关资源
最近更新 更多