1

我正在查看一些使用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 来获得可信的 Promise
  • then:通过将函数应用于承诺的履行价值来转换承诺的价值。

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

4

1 回答 1

2

查看实现本身确实可以解决这个问题:

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函数为库提供了一个重要的入口点,例如在这个版本 (10/2011)初始提交 (5/2011)中。
有趣的是提交架构决定 when() 应该总是返回一个承诺结果,9/2011)。开创性的工作,真的:-)

于 2015-08-12T20:26:09.197 回答