【问题标题】:What is the difference between `when(foo, f)` and `when(foo).then(f)``when(foo, f)` 和 `when(foo).then(f)` 有什么区别
【发布时间】:2015-08-13 05:09:42
【问题描述】:

我正在查看一些使用when.js 的现有代码。出现几次的模式是:

return when(someBigFunction(), function() {
  doSomeMoreProcessing();
  if (maybe) {
    throw someError;
  }
});

我想他们在这里使用when 的原因是他们当时不确定someBigFunction() 是否会返回一个承诺。

在语义上,上述和:

return when(someBigFunction()).then(function() {
...
});

一般例子不使用promise的返回值(即function() {不是function(x) {) .

API 文档提供了这个:

  • when(x,f):通过将 x 转换为 f 来获得可信的承诺
  • then:通过对 Promise 的实现值应用函数来转换 Promise 的值。

所以我怀疑没有区别,但也许我错过了一个微妙之处?

【问题讨论】:

  • 我一直认为您使用 .then() 是为了将数据获取与您对数据的实际操作分离(这样更容易测试),但不确定。

标签: javascript promise when-js


【解决方案1】:

查看implementation itself 确实清楚这一点:

function when(x, onFulfilled, onRejected, onProgress) {
    var p = Promise.resolve(x);
    if (arguments.length < 2) {
        return p;
    }

    return p.then(onFulfilled, onRejected, onProgress);
}

when(x,f)when(x).then(f) 之间绝对没有区别

(鉴于.then(…) 不关心它的调用堆栈或额外的undefined 参数)

今天,它纯粹是糖,因为when(x, f) 比它的替代品更短,甚至更有效的Promise.resolve(x).then(f)。然而,从历史上看,情况并非总是如此,when 函数为库提供了一个重要的入口点,例如在this version (10/2011)initial commit (5/2011)
有趣的还有commit Architectural decision that when() should always return a promise (result, 9/2011)。开创性的工作,真的:-)

【讨论】:

  • 啊,好吧,在那种情况下,when(x,f) 是一块不必要的糖——一个没有理由的叛逆者。
  • @Roamer-1888:原因似乎主要是历史性的。
  • 你知道,git blame 是一个非常有用的工具:-)
猜你喜欢
  • 2015-10-26
  • 2010-12-12
  • 2015-03-08
  • 2018-07-01
  • 2017-06-23
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多