Javascript 一旦所有内部并发承诺都已解决或拒绝,则解决承诺
我正在寻找类似于承诺的东西。所有都将继续同时解决承诺,即使一个或多个承诺拒绝或抛出错误。每个请求并不依赖于另一个请求 接近我想要的-请查看评论Javascript 一旦所有内部并发承诺都已解决或拒绝,则解决承诺,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我正在寻找类似于承诺的东西。所有都将继续同时解决承诺,即使一个或多个承诺拒绝或抛出错误。每个请求并不依赖于另一个请求 接近我想要的-请查看评论 function fetchRequest (request) { return new Promise(function (resolve, reject) { fetch(request) .then(function(response) { return response.text(); }).
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
});
请只回答本机es6 promise API,谢谢。您本质上是在寻求一种方法来消除任何错误。因此,这样的函数将是您的最佳选择:
function swallow(p) {
// transforms rejected promises into promises fulfilled with undefined
return p.catch(function () { });
}
您将按如下方式使用它:
Promise.all([swallow(fetch('url1.com')), swallow(fetch('url2.com'))]).then(function (data) {
console.log('All requests finished', data); //data could be ['resultXML', undefined]
});
甚至
const promises = ['url1.com', 'url2.com'].map(fetch).map(swallow);
Promise.all(promises).then(function (data) {
// ...
});
您本质上是在寻求一种方法来消化任何错误。因此,这样的函数将是您的最佳选择:
function swallow(p) {
// transforms rejected promises into promises fulfilled with undefined
return p.catch(function () { });
}
您将按如下方式使用它:
Promise.all([swallow(fetch('url1.com')), swallow(fetch('url2.com'))]).then(function (data) {
console.log('All requests finished', data); //data could be ['resultXML', undefined]
});
甚至
const promises = ['url1.com', 'url2.com'].map(fetch).map(swallow);
Promise.all(promises).then(function (data) {
// ...
});
我已经成功地使用了Promise.all
以及只解析fetchRequest
promises
基本上就是这样。对于这种情况,ES6没有(Q)或(Bluebird 2.x)这样的帮助函数,因此我们需要像您一样使用类似的帮助函数。蓝鸟甚至有一个专门的实用程序
但是,在拒绝的情况下,您不会使用undefined
来解决这些问题,而是使用一些有用的值来识别错误
function promiseRequests(requests) {
return Promise.all(requests.map(request => {
return fetch(request).then(res => {
return {value:res};
}, err => {
return {reason:err};
});
}));
}
我已经成功地使用了Promise.all
以及只解析fetchRequest
promises
基本上就是这样。对于这种情况,ES6没有(Q)或(Bluebird 2.x)这样的帮助函数,因此我们需要像您一样使用类似的帮助函数。蓝鸟甚至有一个专门的实用程序
但是,在拒绝的情况下,您不会使用undefined
来解决这些问题,而是使用一些有用的值来识别错误
function promiseRequests(requests) {
return Promise.all(requests.map(request => {
return fetch(request).then(res => {
return {value:res};
}, err => {
return {reason:err};
});
}));
}
首先,要避免错误!“它还删除了我使用抛出错误的能力。”-那么为什么不干脆
resolve(err)
?您打算如何使用它们?你想如何区分履行和拒绝?啊,我明白了。在阅读了你的链接Bergi之后,我想我对承诺的理解终于实现了。我认为多梅尼克的回答解决了我问题的症候,但伯吉的回答解决了根本原因。首先,避免错误!“它还删除了我使用抛出错误的能力。”-那么为什么不干脆resolve(err)
?您打算如何使用它们?你想如何区分履行和拒绝?啊,我明白了。在阅读了你的链接Bergi之后,我想我对承诺的理解终于实现了。我认为Domenic的回答解决了我问题的症状,但Bergi的回答解决了根本原因。请参见)
在Promise.all()的结尾处。问题:此模式是否处理了@guest271314中描述的“过于敏感的错误处理程序”案例?@guest271314:无需“处理”它-(是的,我知道我在做什么:-)注意,没有返回中的.map()
,在获取,promiseRequests
似乎返回未定义的值,@guest271314:这是一个arrow函数,其中返回是隐式的:-),但为了清晰起见(以及与其他两个表达式的一致性,其中不可能有简明的正文),“这是一个arrow函数,其中返回是隐式的:-”),我在夜间尝试了arrow函数,但在获取之前没有返回;在promiseRequests
的promiseRequests
的值中,似乎返回了未定义的,请参见)
在Promise.all()的结尾处。问题:此模式是否处理了@guest271314中描述的“过于敏感的错误处理程序”案例?@guest271314:无需“处理”它-(是的,我知道我在做什么:-)注意,没有返回中的.map()
,在获取,promiseRequests
似乎返回未定义的值,@guest271314:这是一个arrow函数,其中返回是隐式的:-),但为了清晰起见(以及与其他两个表达式的一致性,其中不可能有简明的正文),“这是一个arrow函数,其中返回是隐式的:-”),我在夜间尝试了arrow函数,但在获取之前没有返回;对于promiseRequests
中的Promise
值,似乎返回了未定义的,