gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:17:06 27 4
gpt4 key购买 nike

我有这样的数据:

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,但无法正确处理请求的每个错误。

最佳答案

使用 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 请求的结果然后在结果数组中,因此您仍然可以使用成功的两个请求。

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

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() 子句,那么您不能真正将所有请求一起批处理。

关于javascript - Promise中如何处理连续的axios.get?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408272/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com