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

时间:2015-09-08 15:02:18

标签: ecmascript-6 es6-promise

我已经看到本机ES6 Promise.resolve()可以直接调用 - 作为静态方法。 Facebook正在他们的Flux示例中使用它。

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

3 个答案:

答案 0 :(得分:11)

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

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
        });
    }
}

答案 1 :(得分:2)

从语义上讲,返回promises的函数是异步函数,如你所知,可以链接在一起:

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

虽然同步函数也可以是异步链的一部分,但这只能起作用,因为.then函数会自动将返回值从您传递给函数的函数提升为promises。例如。如果b和/或c返回非承诺的值,则链仍然有效,但如果a返回非承诺值,那么TypeError

在大多数情况下,你可能知道a返回什么,所以这很好,但是如果你不知道a会返回什么(比如说你正在进行泛型编程),那么你可以这样做:

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

abc现在在这方面被视为相同:

  • 如果a返回1,则b将很快调用1
  • 如果a返回承诺,则b将被a链接。

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

另外,在您需要立即解决的承诺的情况下,这些方法可以派上用场。 E.g。

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

答案 2 :(得分:1)

Promise.resolve(42)只是

的简写
new Promise(function(resolve) {
    resolve(42);
});

因此,每当您发现自己正在做这样的事情,即从现有值创建承诺时,您可以使用Promise.resolve代替。