Как обработать последовательный axios.get в Promise? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть такие данные:

const resultData = {};
const data = {
  'foo': 'https://valid/url/1',
  'bar': 'https://valid/url/2',
  'baz': 'https://INVALID/url/3',
};

, и я хотел бы сделать запрос GET для каждого URL.

Если запрос завершится успешно, я хочу добавить ответ к resultData.Если нет, ничего не делайте и не вызывайте ошибок.

resultData будет выглядеть так:

resultData = {
  'foo': { ...responseOfFoo },
  'bar': { ...responseOfBar },
};

Я написал код, подобный приведенному ниже, но я не понимаю, чего я хочуделать.

axios выдает ошибку, когда запрос завершается неудачно с 404, и, кроме того, async / await, похоже, не работает правильно.

import _ from 'lodash';

return new Promise((resolve, reject) => {
  const resultData = {};
  _.forEach(data, async (url, key) => {
    const res = await axios.get(url).catch(null);
    resultData[key] = res.data;
  });

  resolve(resultData);
});

Что с этим не так?

Я также пытался использовать axios.all или Promise.all, но не смог правильно обработать каждую ошибку запроса.

1 Ответ

0 голосов
/ 21 ноября 2018

Используйте Promise.all и добавляйте обработчик ошибок .catch () в конец каждого запроса GET, чтобы, если они выдают ошибку, он перехватывался до того, как Promise.all сгруппировал результаты.

Что-то вроде:

const data = {
  'foo': 'https://valid/url/1',
  'bar': 'https://valid/url/2',
  'baz': 'https://INVALID/url/3',
};
Promise
.all(
    Object
    .entries( data )
    .map(({ name, url }) => axios
        .get( url )
        .catch( error => {
            throw new Error( `Failed GET request for ${ name }` );
            // Individual GET request error handler.
        })
    )
)
.then( results => {

})
.catch( error => {
    //  error on the Promise.all level, or whatever an individual error handler throws.
    //  So if the url of foo rejects, it will get thrown again by the catch clause after .get()
    //  So the error would be 'Failed GET request for foo'.
});

Если вы выбросите ошибку в предложении catch запросов GET, ошибка будет всплывать до предложения catch после Promise.all ()

Если вывернуть значение из предложения catch, которое будет результатом запроса get, а затем в массиве результатов, так что вы все равно сможете использовать два успешно выполненных запроса.

В следующем примере просто будет возвращен объектописание проблемы в случае сбоя одного из запросов на получение и проверки результатов на достоверность вместе.

Promise
.all([
  Promise.resolve( 'ok1' ).then( result => ({ "status": "ok", "value": result })),
  Promise.resolve( 'ok2' ).then( result => ({ "status": "ok", "value": result })),
  Promise.reject( 'nok3' ).catch( error => ({ "status": "nok", "value": error }))
])
.then( results => {
  results.forEach(( result, index ) => {
    if ( result.status === 'ok' ) console.log( `promise ${ index } resolved correctly: ${ result.value }`);
    else console.log( `promise ${ index } rejected with error: ${ result.value }` );
  });
})
.catch( error => console.error( error ));

Если вам нужно иметь возможность обрабатывать ошибку GET-запроса по отдельности и при этом вызывать предложение .then () для остальных URL-адресов, вы не можете выполнить пакетвсе запросы вместе для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...