Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何处理连续的axios.get-in-Promise?_Javascript_Promise_Axios - Fatal编程技术网

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)
,它似乎也不起作用,但我会试试的。