如何在Promise中处理连续的axios.get?

时间:2018-11-21 08:50:59

标签: javascript promise axios

我有这样的数据:

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

,我想对每个网址提出GET请求。

如果请求成功,我想将响应添加到resultData。 如果没有,则不执行任何操作,也不会引发任何错误。

resultData会像这样:

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

我写了如下代码,但这并没有实现我想做的事情。

当请求失败并显示404时,axios会引发错误,此外,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.allPromise.all,但无法正确处理请求的每个错误。

1 个答案:

答案 0 :(得分:2)

使用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'.
});

如果在GET请求的catch子句中引发错误,则该错误将在Promise.all()之后冒泡到catch子句

如果从catch子句内部返回一个值,该值将是get请求的结果,然后在results数组中,因此您仍然可以使用两个成功的请求。

如果“获取请求”之一失败,下面的示例将仅返回描述问题的对象,并将一起检查结果的有效性。

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请求错误,并且仍然触发其余URL的.then()子句,则您实际上无法将所有请求一起批处理。