我什么时候应该直接调用 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
.
在大多数情况下,您可能知道 a
return 是什么,所以这很好,但在您不知道 a
将 return 是什么的情况下(假设你正在做泛型编程),那么你可以这样做:
Promise.resolve(a()).then(b).then(c).catch(failure);
a
、b
和 c
现在在这方面的处理方式相同:
- 如果
a
returns 1
,那么b
很快就会被调用1
.
- 如果
a
return 是一个承诺,那么 b
将被链接在 a
之后。
方法 Promise.reject
对故障链完成同样的事情。
此外,如果您只需要立即解决的承诺,这些方法会很方便。例如
[a, b, c].reduce((p, f) => p.then(f), Promise.resolve()).catch(failure);
我看到原生 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
.
在大多数情况下,您可能知道 a
return 是什么,所以这很好,但在您不知道 a
将 return 是什么的情况下(假设你正在做泛型编程),那么你可以这样做:
Promise.resolve(a()).then(b).then(c).catch(failure);
a
、b
和 c
现在在这方面的处理方式相同:
- 如果
a
returns1
,那么b
很快就会被调用1
. - 如果
a
return 是一个承诺,那么b
将被链接在a
之后。
方法 Promise.reject
对故障链完成同样的事情。
此外,如果您只需要立即解决的承诺,这些方法会很方便。例如
[a, b, c].reduce((p, f) => p.then(f), Promise.resolve()).catch(failure);