Javascript 如何处理连续的axios.get-in-Promise?
我有这样的数据:Javascript 如何处理连续的axios.get-in-Promise?,javascript,promise,axios,Javascript,Promise,Axios,我有这样的数据: const resultData = {}; const data = { 'foo': 'https://valid/url/1', 'bar': 'https://valid/url/2', 'baz': 'https://INVALID/url/3', }; resultData = { 'foo': { ...responseOfFoo }, 'bar': { ...responseOfBar }, }; 我想对每个URL发出GET请求 如果请求
const resultData = {};
const data = {
'foo': 'https://valid/url/1',
'bar': 'https://valid/url/2',
'baz': 'https://INVALID/url/3',
};
resultData = {
'foo': { ...responseOfFoo },
'bar': { ...responseOfBar },
};
我想对每个URL发出GET请求
如果请求成功,我想将响应添加到resultData
。
如果没有,则不执行任何操作,也不要提出任何错误
resultData
将如下所示:
const resultData = {};
const data = {
'foo': 'https://valid/url/1',
'bar': 'https://valid/url/2',
'baz': 'https://INVALID/url/3',
};
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
,但无法正确处理请求中的每个错误。使用Promise.all并将.catch()错误处理程序附加到每个GET请求的末尾,这样,如果他们抛出错误,它会在Promise之前被捕获。所有人将结果分组
比如:
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数组中的结果,因此您仍然可以使用成功的两个请求
如果其中一个“get请求”失败,下面的示例将只返回一个描述问题的对象,并一起检查结果的有效性
承诺
.全部([
Promise.resolve('ok1')。然后(result=>({“status”:“ok”,“value”:result}),
Promise.resolve('ok2')。然后(result=>({“status”:“ok”,“value”:result}),
Promise.reject('nok3').catch(error=>({“status”:“nok”,“value”:error}))
])
。然后(结果=>{
结果.forEach((结果,索引)=>{
如果(result.status=='ok')console.log('promise${index}解析正确:${result.value}`);
else console.log(`promise${index}被拒绝,错误为:${result.value}`);
});
})
.catch(error=>console.error(error))代码>谢谢,但是如果任何url返回404,我怎么能忽略这个错误呢?就像我的问题一样,即使'baz':'https://INVALID/url/3“
throws未找到,其余数据插入到resultData
中。不要重新抛出catch
您可以将catch子句替换为您希望的任何错误处理,如检查状态代码等。我想指出的一点是,您可以在那里捕获单个GET请求错误。如果你想在Promise之后在catch子句中“冒泡”错误。总之,就像在不同级别上进一步处理错误一样,你可以在GET请求的catch中抛出一个新错误,这样它就会在Promise链中冒泡。好吧,即使我在每个axios.GET中附加.catch(null)
,它似乎也不起作用,但我会试试的。