我能够成功执行 Promise.all,并优雅地处理解决和拒绝。然而,有些承诺会在几毫秒内完成,有些可能/可能需要一段时间。
我希望能够为 Promise.all 中的每个承诺设置超时,因此它可以尝试最多花费 5 秒。
getData() {
var that = this;
var tableUrls = ['http://table-one.com','http://table-two.com'];
var spoonUrls = ['http://spoon-one.com','http://spoon-two.com'];
var tablePromises = that.createPromise(tableUrls);
var spoonPromises = that.createPromise(spoonUrls);
var responses = {};
var getTableData = () => {
var promise = new Promise((resolve, reject) => {
Promise.all(tablePromises.map(that.rejectResolveHandle))
.then((results) => {
responses.tables = results.filter(x => x.status === 'resolved');
resolve(responses);
});
});
return promise;
};
var getSpoonData = () => {
var promise = new Promise((resolve, reject) => {
Promise.all(spoonPromises.map(that.rejectResolveHandle))
.then((results) => {
responses.tables = results.filter(x => x.status === 'resolved');
resolve(responses);
});
});
return promise;
};
return getTableData()
.then(getSpoonData);
}
rejectResolveHandle() {
return promise.then(function(v) {
return {v:v, status: "resolved"};
}, function(e) {
return {e:e, status: "rejected"};
});
}
createPromise(links) {
var promises = [];
angular.forEach(links, function (link) {
var promise = that._$http({
method: 'GET',
url: link + '/my/end/point',
responseType: 'json'
});
promises.push(promise);
});
return promises;
}
我尝试将超时添加到 createPromise()
,但这似乎不起作用。将超时设置为 300 毫秒,一些请求会持续 4 秒以上:
createPromise(links) {
var promises = [];
angular.forEach(links, function (link) {
var promise = that._$http({
method: 'GET',
url: link + '/my/end/point',
responseType: 'json'
});
promise = new Promise((resolve) => {
setTimeout(() => {
resolve(promise);
}, 300);
});
promises.push(promise);
});
return promises;
}
如果它能让事情变得更容易,我可以访问 Bluebird?
原文由 Oam Psy 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一个创建
Promise.raceAll()
函数的方案,它的工作方式有点像Promise.all()
和Promise.race()
的组合 - 并且所有时间都承诺超时promise 在那之前没有解决,它将被短路以解决传入的值。这实质上将每个承诺放入一个带有计时器的Promise.race()
中。如果计时器获胜,则使用默认值解决承诺。如果原始承诺获胜,则使用实际承诺结果解决。我们使用Promise.race()
来解决第一个完成的问题(超时或原始承诺)。这是Promise.race()
的经典用法(事实上,这是我真正用过的唯一实际用途)。一个典型的例子是在接下来的 15 秒内让我得到你能得到的所有结果。任何超过 15 秒的结果,只需返回
null
给他们,不要等待他们。这是使这个概念起作用的代码:So, you use
Promise.raceAll()
likePromise.all()
in that you pass it an array of promises, but you also pass it atimeoutTime
and atimeoutVal
。timeoutTime
是承诺超时前等待的时间。timeoutVal
是为任何超时的承诺放入结果数组的内容(通常它类似于null
你可以很容易地将其识别为非真实结果)。我不确定我是否完全了解您在特定代码中所做的事情,但这是使用上述内容的
links
代码:或者,如果您想确保
Promise.raceAll()
获得所有结果,即使某些承诺被拒绝,您也可以为每个承诺添加一个.catch()
处理程序: