我已经发布了 Wait until all promises complete even if some rejected 和 d3.js v5,但出现了关于这段代码的另一个问题:
var files = ["data1.json", "data2.json", "data3.json"];
var promises = [];
files.forEach(function(url) {
promises.push(d3.json(url))
});
Promise.all(promises).then(function(values) {
console.log(values)
});
如果其中一个 URL 无效,则 Promise.all 不会返回任何结果;换句话说,所有响应都必须有效,Promise.all 才能返回值。如果其中一个 URL 出现错误,如何获得其他响应?
最佳答案
这就是Promise.all
的工作原理。但如果你想让它为被拒绝的 promise 工作,你可以这样做:
var files = ["data1.json", "data2.json", "data3.json"];
var promises = [];
files.forEach(function(url) {
promises.push(
d3.json(url)
.then(function(data) {
return {success: true, data: data};
}, function() {
return {success: false};
})
)
});
Promise.all(promises).then(function(values) {
console.log(values)
});
请注意Promise#then
可以接受两个函数作为参数,第一个函数在 Promise 被解析时调用,第二个函数在 Promise 被拒绝时调用。
您可以手动解析被拒绝的 Promise,并且可以返回一个标识符来了解调用是否导致成功或失败,就像我使用 success
键所做的那样。
关于javascript - 如果其中一个 promise 失败,Promise.all 不会返回任何 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49538223/