我有这样的数据:
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.all
或Promise.all
,但无法正确处理请求的每个错误。
答案 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()子句,则您实际上无法将所有请求一起批处理。