Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.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递归获取数据并链接结果_Javascript_Promise_Axios - Fatal编程技术网

Javascript 使用axios递归获取数据并链接结果

Javascript 使用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

我有一个模式的url
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
函数返回promise
p
,但是,由于您希望从
catch
中获得结果,您是否也尝试返回此值?:
return Promise.resolve(returnArray)
抱歉,忘记重命名函数,
getLeadData
等于
getData
。还有
return
处理程序中的
returnArray