2 回答
TA贡献1780条经验 获得超4个赞
你不是在等待res.json()返回的承诺。Promise.all()您可以在您的结果上添加另一个,.map()或者您可以将它们烘焙到您使用的原始承诺中Promise.all()。后者是我的建议:
function fetchJSON(...args) {
return fetch(...args).then(response => {
if (!response.ok) {
throw new Error(`Error ${response.status}`);
}
return response.json();
});
}
getData: function() {
Promise.all([
fetchJSON('@Url.Action("GetSomething")', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(this.selectedValues)
}),
fetchJSON('@Url.Action("GetSomethingElse")', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(this.selectedValues)
})
]).then(responseArray => {
console.log("LOG: ", responseArray);
// use responseArray here
}).catch(error => {
console.log(error);
});
},
仅供参考,我经常发现使用检索响应fetch()是不必要的冗长,因此最终使用某种辅助函数,如fetchJSON()我在这里使用的,以防止重复代码。
在我看来,fetch()
界面应该提供两件事。
一个选项,让您告诉它如果不是 2xx 状态,您希望它拒绝。我理解在这种情况下并不总是拒绝的用例,但可能有更多用例您希望它拒绝,所以它应该是一个选项。
告诉它读取响应并以文本、json 或其他类型返回的选项,因此您不必再进行另一个承诺返回函数调用来执行此操作。
仅供参考,request-promise
nodejs 的模块,具有这两个选项(因为它们经常需要)。
但是,由于它没有这些选项(尽管它们经常需要),我们有时必须将其包装以添加这些选项以避免重复代码。在这种情况下,如果不是 2xx 状态,您希望它拒绝,并且您希望它读取和解析 JSON,并且您希望在两个地方执行此操作,因此我们制作了一个小型实用程序函数来执行此操作。
TA贡献1809条经验 获得超8个赞
在回调中返回一个Promise 会导致在链then中的 next 中解决 Promise 。then
然而,这里返回了一个 promise 数组,promise 没有在 next 中解决then:
return responses.map(response => {
return response.json();
});
应该有另一个Promise.all并行解决它们:
return Promise.all(responses.map(response => {
return response.json();
}));
或者可以将其重写为使用for循环的顺序处理,因为在发出请求后预计并行性不会有明显的改进。
无论如何,async..await使这更简单:
async getData() {
try {
const responses = await Promise.all([
fetch(...),
fetch(...)
]);
const responseArray = [];
for (const response of responses) {
if (!response.ok)
throw new Error(`Error ${response.status}`);
responseArray.push(await response.json());
}
...
} catch (error){
console.log(error);
}
}
添加回答
举报