我已经看到本机ES6 Promise.resolve()
可以直接调用 - 作为静态方法。 Facebook正在他们的Flux示例中使用它。
但在什么情况下我应该这样做?排队的东西?或者不是使用window.setTimeout()
?
答案 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);
a
,b
和c
现在在这方面被视为相同:
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
代替。