我什么时候应该直接调用 Promise.resolve() ?

When should I call Promise.resolve() directly?

我看到原生 ES6 Promise.resolve() 可以直接调用 - 作为静态方法。 Facebook 在他们的 Flux 示例中就是这样使用它的。

但是在什么情况下我应该这样做呢?排队什么的?或者不使用 window.setTimeout()?

当您需要创建一个已解决的承诺时,您应该调用 Promise.resolve(object)。例如,您可能有一个函数开始从服务器下载资源或 returns 其缓存版本:

function getImage(imageUrl) {
    if (imageUrl in this.cache) {
        // no need to download, return immediately
        return Promise.resolve(this.cache[imageUrl]);
    } else {
        return new Promise(function(resolve, reject) {
            // start downloading and eventually resolve
        });
    }
}

Promise.resolve(42) 只是 shorthand 对于

new Promise(function(resolve) {
    resolve(42);
});

所以每当你发现自己在做这样的事情时,即从现有值创建承诺,你可以改用 Promise.resolve

从语义上讲,return 承诺的函数是 异步函数,并且如您所知,可以链接在一起:

a().then(b).then(c).catch(failure);

虽然同步函数也可以是异步链的一部分,但这只有效,因为 .then 函数自动将您传递给它的函数的 return 值提升为 promise。例如。如果 b and/or c return 值不是承诺,那么链仍然有效,但如果 a return 是非承诺值那就是 TypeError.

在大多数情况下,您可能知道 areturn 是什么,所以这很好,但在您不知道 a 将 return 是什么的情况下(假设你正在做泛型编程),那么你可以这样做:

Promise.resolve(a()).then(b).then(c).catch(failure);

abc 现在在这方面的处理方式相同:

  • 如果a returns 1,那么b很快就会被调用1.
  • 如果 a return 是一个承诺,那么 b 将被链接在 a 之后。

方法 Promise.reject 对故障链完成同样的事情。

此外,如果您只需要立即解决的承诺,这些方法会很方便。例如

[a, b, c].reduce((p, f) => p.then(f), Promise.resolve()).catch(failure);