【发布时间】:2021-09-12 13:12:19
【问题描述】:
我能够成功执行 Promise.all,并优雅地处理解析和拒绝。但是,有些承诺会在几毫秒内完成,有些可能/可能需要一段时间。
我希望能够为 Promise.all 中的每个 Promise 设置一个超时,因此它可以尝试最多花费 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 能让事情变得更简单,我可以使用它吗?
【问题讨论】:
-
使用 RxJs / Observables 是一种可能的选择吗?
-
@Pac0 - RxJs 是的,版本 5.4.0... 和 observe-js 版本 0.5.7
-
你真的想对每一个承诺设置一个超时时间,还是你真的只想要一个计时器,如果任何事情花费的时间太长,就会导致整个事情失败?请记住,如果任何一个失败,整个 Promise.all 都会失败。考虑到这一点,是否有理由不简单地添加一个在......比如说...... 3 秒内失败的包装器,如果整个事情还没有完成?
-
@Norguard - 它应该针对每个承诺,而不是全部。了解整个 Promise.all 可能会失败,以及为什么在 rejectResolveHandle 中处理它们
-
当询问由您的代码引起的问题时,如果您提供人们可以用来重现问题的代码,您将获得更好的答案。该代码应该是…… Minimal – 使用尽可能少的代码,但仍会产生同样的问题。见How to create a Minimal, Complete, and Verifiable example。
标签: javascript angularjs angular-promise es6-promise bluebird