Javascript 使用axios递归获取数据并链接结果
我有一个模式的urlJavascript 使用axios递归获取数据并链接结果,javascript,promise,axios,Javascript,Promise,Axios,我有一个模式的urlhttp://www.data.com/1,其中末尾的1可以向上运行,直到出现一个未预定义的数字。它返回一个数组。我需要将所有数组连接到一个数组中 我的策略是递归地执行get请求,直到得到404错误,然后返回结果 var returnArray = []; function getData(count){ let p = axios.get(`http://www.data.com/${count}`).then(function(response){ returnAr
http://www.data.com/1
,其中末尾的1可以向上运行,直到出现一个未预定义的数字。它返回一个数组。我需要将所有数组连接到一个数组中
我的策略是递归地执行get请求,直到得到404错误,然后返回结果
var returnArray = [];
function getData(count){
let p = axios.get(`http://www.data.com/${count}`).then(function(response){
returnArray = returnArray.concat(response.data);
return getData(count +1);
}
).catch(function() {
Promise.resolve(returnArray);
}
)};
然而,当我实现这个函数时,我的结果是未定义的
getData(1).then((response) => console.log(response))
执行此操作的最佳方法是什么?在
getData
中,您没有返回承诺,因此函数立即以未定义的值退出。
因此,不是:
let p = axios.get(`http://www.data.com/${count}`).then(function(response){
Promise.resolve(returnArray);
使用:
编辑:正如Bergi指出的,您还需要在catch
处理程序中返回returnArray
,而不是:
let p = axios.get(`http://www.data.com/${count}`).then(function(response){
Promise.resolve(returnArray);
使用:
以下是完整的代码:
var returnArray = [];
function getData(count){
return axios.get(`http://www.data.com/${count}`).then(function(response){
returnArray = returnArray.concat(response.data);
return getData(count +1);
}
).catch(function() {
return returnArray;
}
)};
我相信承诺的顺序取决于数量,所以你必须把承诺一个接一个地排序 您可以通过增加
cnt
参数并将结果累积到sp
函数的rs
参数中,直到最终承诺被拒绝为止,来执行递归合并。一旦被拒绝,因为之前的所有解析都已在rs
参数中串联,只需在catch
阶段返回它即可
在下面的代码中,ps
数组类似于一个API,ps[cnt]
类似于对API的调用
axios.get(`http://www.data.com/${cnt}`);
var ps=[newpromise((v,x)=>setTimeout(v,Math.random()*1000,[0,1,2]),
新承诺((v,x)=>setTimeout(v,Math.random()*1000[3,4,5]),
新承诺((v,x)=>setTimeout(v,Math.random()*1000[6,7,8]),
新承诺((v,x)=>setTimeout(x,1000,null)),
sp=(cnt=0,rs=[])=>ps[cnt]。然后(vs=>sp(++cnt,rs.concat(vs)))
.渔获物(e=>rs);
sp().then(console.log)
不确定最佳方式,但我会使用async/await
和while
循环,直到得到404响应。什么是getLeadData
?我认为函数getLeadData
也应该返回promise?我猜您从getData
函数返回promisep
,但是,由于您希望从catch
中获得结果,您是否也尝试返回此值?:return Promise.resolve(returnArray)
抱歉,忘记重命名函数,getLeadData
等于getData
。还有return
处理程序中的returnArray