В противном случае выборка в ошибке не ловили Promise.all

голоса
1

У меня есть несколько JSON , чтобы загрузить и проверить , если все из них хорошо неправдоподобные. Поэтому я использую Promise.all ждать все fetch.

Первый valid.jsonсуществует, а не второй, так что вторые fetchконцы с 404. Но , несмотря на Promise.reject, по- Promise.allпрежнему входит Success!вместо того , чтобы выбросить последнюю ошибку.

Есть ли что - то я пропустил о том , как Promise.allработает?

const json_pathes = [
    'valid.json',
    'not_valid.json'
];

function check_errors(response) {
    if (!response.ok) {
        Promise.reject('Error while fetching data');
        throw Error(response.statusText + ' (' + response.url + ')');
    }
    return response;
}

Promise.all(json_pathes.map(url =>
    fetch(url)
        .then(check_errors)
        .then(response => response.json())
        .catch(error => console.log(error))
))
.then(data => {
    console.log('Success!', data);
})
.catch(reason => {
    throw Error(reason);
});

// Console:
// Error: Not Found (not_valid.json)
// uncaught exception: Error while fetching data
// Array [ […], undefined ]

(Проверено все подобные вопросы, конечно, но ничего не помогало 😕)


редактировать - Исправлен код после того, как ниже ответов:

const json_pathes = […]
Promise.all(json_pathes.map(url =>
    fetch(url)
        .then(response => {
            if (!response.ok)
                throw Error(response.statusText + ' (' + response.url + ')');
            return response;
        })
        .then(response => response.json())
        .catch(error => {
            throw error;
        })
))
.then(data => {
    // Success
})
.catch(error => {
    throw error;
});
Задан 02/12/2019 в 23:57
источник пользователем
На других языках...                            


2 ответов

голоса
2

Этот вызов:

 .catch(error => console.log(error))

... возвратит правдивое обещание, а не отклоненный один. Когда вы лечите отказ, и вы хотите, чтобы пузыриться, как отказ, вы должны явно сделать это:

 .catch(error => {
       console.log(error);
       throw error; // cascade...
 })

Кстати, это не имеет никакого эффекта на всех

 Promise.reject('Error while fetching data');

... как вы ничего не делать с этим вновь созданным, отвергнутым обещанием.

Ответил 03/12/2019 в 00:02
источник пользователем

голоса
1

вы должны бросить ошибку еще раз, когда вы используете метод .catch (), или будет отключена ошибка

Promise.all(
  json_paths.map(url => 
    fetch(url)
      .then(response => response.json())
      .catch(err => {
        console.log(err);
        throw err
      })
  )
).then(data => {
  // all promise resolved
  console.log(data)
}).catch(err => {
  // some promise may not be resolved
  console.log(err)
})

Ответил 03/12/2019 в 00:05
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more