【发布时间】:2015-09-04 23:22:08
【问题描述】:
我正在寻找类似于 Promise.all 的东西,即使在一个或多个 Promise 拒绝或抛出错误的情况下,它也会继续同时解决 Promise。每个请求不依赖于另一个请求。
接近我想要的 - 请看 cmets
function fetchRequest (request) {
return new Promise(function (resolve, reject) {
fetch(request)
.then(function(response) {
return response.text();
}).then(function (responseXML) {
//Do something here. Maybe add data to dom
resolve(responseXML);
}).catch(function (err) {
reject(new Error(err));
}
}
function promiseRequests (requests) {
var result = Promise.resolve();
for (var i = 0; i < requests.length; i++) {
result = fetchRequest(requests[i])
}
//This is wrong as it will resolve when the last promise in the requests array resolves
// - not when all requests resolve
resolve(result);
}
promiseRequests(['url1.com', 'url2.com']).then(function (data) {
console.log('All requests finished');
//optionally have data be an array of resolved and rejected promises
});
我已经成功地使用了Promise.all,并且只解决了 fetchRequest 承诺,这导致了预期的结果(结果数组和undefined's),但我觉得这是错误的做事方式.它还消除了我使用抛出错误的能力。
有效,但感觉使用 resolve 不正确
function fetchRequest (request) {
return new Promise(function (resolve, reject) {
fetch(request)
.then(function(response) {
return response.text();
}).then(function (responseXML) {
resolve(responseXML);
}).catch(function (err) {
resolve();
}
}
Promise.all([fetchRequest('url1.com'), fetchRequest('url2.com')]).then(function (data) {
console.log('All requests finished', data); //data could be ['resultXML', undefined]
});
请仅使用原生 es6 Promise API 回答谢谢。
【问题讨论】:
-
"它还消除了我使用抛出错误的能力。" - 那么为什么不只是
resolve(err)?你打算如何使用它们?您想如何区分履行和拒绝? -
啊,我明白了。在阅读了您的链接 Bergi 之后,我认为我对承诺的理解终于得到了点击。我认为 Domenic 的回答解决了我的问题的症状,但 Bergi 的回答解决了根本原因。
标签: javascript promise es6-promise