Вам не нужно много того, что у вас есть в вашем вопросе или в вашем ответе. Вы можете просто сделать это:
const url1 = "http://fakeapi.com/getData1";
const url2 = "http://fakeapi.com/getData2";
return Promise.all([
fetch(url1).then(res => res.json()).then(data1SpecificAction),
fetch(url2).then(res => res.json())
]).then([data1, data2] => {
if (data1 && data2) return; // resolve
// reject with appropriate error
let msg = data1 ? "missing data2" : "missing data1";
throw new Error(msg);
});
То, что вам не нужно делать в вопросе и ответе:
- Не оборачивайте существующие обещания в другое обещание, созданное вручную. Это считается анти-шаблоном, поскольку созданное вручную обещание просто не нужно. Вы можете просто вернуть обещания, которые у вас уже есть.
- Не назначайте результат
.then()
переменной с более высокой областью действия. Хотя иногда для этого есть причины, это не одна из них и обычно является предупреждением о том, что вы делаете что-то неправильно.
Интерфейс fetch()
вызывает некоторые неудобства которые я часто нахожу полезными для вспомогательной функции (например, статус 404 разрешает, а не отклоняет):
function fetchJson(...args) {
return fetch(...args).then(res => {
if (!res.ok) throw new Error(`Got ${res.status} status`);
return res.json();
});
}
const url1 = "http://fakeapi.com/getData1";
const url2 = "http://fakeapi.com/getData2";
return Promise.all([
fetchJson(url1).then(data1SpecificAction),
fetchJson(url2)
]).then([data1, data2] => {
if (data1 && data2) return; // resolve
// reject with appropriate error
let msg = data1 ? "missing data2" : "missing data1";
throw new Error(msg);
});
И в вашем конкретном случае c, когда вы хотите отклонить, если результат ложно, вы даже можете сделать это:
function fetchJsonCheck(...args) {
return fetch(...args).then(res => {
if (!res.ok) throw new Error(`Got ${res.status} status`);
return res.json();
}).then(result => {
if (!result) throw new Error("empty result");
return result;
});
}
const url1 = "http://fakeapi.com/getData1";
const url2 = "http://fakeapi.com/getData2";
return Promise.all([
fetchJsonCheck(url1).then(data1SpecificAction),
fetchJsonCheck(url2)
]);