Javascript 异步/等待递归API调用

Javascript 异步/等待递归API调用,javascript,recursion,async-await,promise,Javascript,Recursion,Async Await,Promise,我正在尝试从分页端点收集所有ID。 我想等待所有呼叫完成,但它似乎只完成第一个呼叫,并返回数据和对下一个呼叫的承诺 我怎样才能等待所有的呼叫返回 const getSelectAllIds = async (url) => { let response = await axios.post(url); if (response.status === 200 && response.data.next != null) { console.log(`calli

我正在尝试从分页端点收集所有ID。 我想等待所有呼叫完成,但它似乎只完成第一个呼叫,并返回数据和对下一个呼叫的承诺

我怎样才能等待所有的呼叫返回

const getSelectAllIds = async (url) => {
  let response = await axios.post(url);
  if (response.status === 200 && response.data.next != null) {
    console.log(`calling: ${response.config.url}`);
    return [
      ...response.data.results,
      await getSelectAllIds(response.data.next)
    ];
  }
};

const someFunction = async (url, data) => {
  const selectedIds = await getSelectAllIds(url);
  return selectedIds;
};
所有异步函数总是返回一个承诺。因此GetSelectAllID和someFunction都将始终返回一个承诺。调用方必须使用。然后或等待从承诺中获取值。不能使它们同步返回异步检索的值。Javascript不是这样工作的

这就是异步编码在nodejs中的工作方式。不能将异步值转换为同步值。必须使用异步机制使用异步值。对于承诺,这意味着调用方必须使用wait of.then来获取值

getSelectAllIds(someUrl).then(allIDs => {
     console.log(allIDs);
}).catch(err => {
     console.log(err);
});
注意,如果response.status不是200,则不清楚您希望代码做什么。而且,看起来您没有从最后一页收集数据,因为如果没有数据,您不会将数据添加到数组中。接下来。

所有异步函数都会返回一个承诺,始终。因此GetSelectAllID和someFunction都将始终返回一个承诺。调用方必须使用。然后或等待从承诺中获取值。不能使它们同步返回异步检索的值。Javascript不是这样工作的

这就是异步编码在nodejs中的工作方式。不能将异步值转换为同步值。必须使用异步机制使用异步值。对于承诺,这意味着调用方必须使用wait of.then来获取值

getSelectAllIds(someUrl).then(allIDs => {
     console.log(allIDs);
}).catch(err => {
     console.log(err);
});
注意,如果response.status不是200,则不清楚您希望代码做什么。而且,看起来您没有从上一页收集数据,因为如果没有数据,您不会将数据添加到数组中。下一步。

我想您需要:

const getSelectAllIds=异步url=>{ 常量响应=等待axios.postrl; if!response.ok抛出新错误'HTTP Error';//不要忽略这些错误。 返回[ …响应、数据、结果, …response.data.next?等待getSelectAllIdsresponse.data.next:[] ]; } 我想你想要这个:

const getSelectAllIds=异步url=>{ 常量响应=等待axios.postrl; if!response.ok抛出新错误'HTTP Error';//不要忽略这些错误。 返回[ …响应、数据、结果, …response.data.next?等待getSelectAllIdsresponse.data.next:[] ]; } 异步发电机

我将建议一种不同的方法,使用异步生成器。我希望这种方法的好处是不言而喻的-

异步函数post url {const r=wait axios.postrl 如果r.status==200 返回r.data/异步生成器

我将建议一种不同的方法,使用异步生成器。我希望这种方法的好处是不言而喻的-

异步函数post url {const r=wait axios.postrl 如果r.status==200
return r.data//您是否在询问如何使某个函数或GetSelectAllID不返回承诺?如果您是这样问的,则不能。所有异步函数都返回承诺。调用方必须使用wait或。然后才能从承诺中获取值。是的,我要确保从分页页面收集所有数据,即.SelectID返回所有数据,而不是承诺。听起来我不能使用async/Wait,那么在这种情况下,我认为一个问题是,如果您的结果有3页,您将只获得2页数据。最后一页将被跳过。您是否询问如何使某个函数或GetSelectAllID不返回承诺?如果是这样的话如果你问,你不能。所有异步函数都会返回一个承诺。调用者必须使用wait或。然后才能从承诺中获取值。是的,我想确保我收集了分页页面中的所有数据,即SelectID返回所有数据,而不是承诺。听起来我不能使用async/wait,那么在这种情况下,我认为1个问题是一个问题至少,如果你的结果有3页,你只会得到2页的数据。最后一页将被跳过。是的,我有很多代码被拉出,因为我不能显示任何东西,但这正是我想要的。我很困惑,因为我认为async/await是一种写承诺的不同方式,而没有then@KyleCalica-St-await在一个小时内工作得很好n异步函数。它将暂停函数执行,直到承诺得到解决。但调用方在第一次等待时仍会返回异步承诺。此处的等待返回[…response.data.results,wait getSelectAllIdsresponse.data.next];有效并大大简化了代码。这就是您使用它的方式。但他已经在使用wait。那么问题是什么呢?@arminyahya-问题是OP希望GetSelectAllID返回值,而不是返回承诺。但是,异步函数不起作用
事实上,您永远不会同步返回异步检索的值。异步值必须使用异步机制(承诺、回调、事件等)传回调用方。@jfriend00感谢您的解释,我相信我现在已经开始更多地理解这一点。是的,我提取了很多代码,因为我无法显示任何内容,但这正是我所寻找的。我很困惑,因为我认为async/await是另一种写承诺的方式,而不是then@KyleCalica-St-await在异步函数中工作得很好。它将暂停函数执行,直到承诺得到解决。但是调用方仍然会在到达第一个wait时返回异步承诺。此处的wait返回[…response.data.results,wait getSelectAllIdsresponse.data.next];工作并大大简化了您的代码。这就是你使用它的方式。但是他已经在使用了等待。那么问题是什么呢?@arminyahya-问题是OP希望GetSelectAllId返回值,而不是返回承诺。但是,异步函数不是这样工作的,事实上,您永远不会同步返回异步检索的值。异步值必须使用异步机制(承诺、回调、事件等)传回调用方。@jfriend00感谢您的解释,我相信我现在已经开始更多地理解这一点。这不适用于我的用例,我需要按照您的建议做,并等待它们全部完成。我已经接受了一个答案,现在我对这个项目的问题更多的是rxjs和Redux的放松。但这是一个伟大的解释和展示发电机我将保存这篇文章肯定!凯尔,我很高兴你能从答案中有所收获。没有生成器的第二部分在返回完整的结果数组之前等待所有生成器。祝你有一个愉快的一天:DDoS对我的用例不起作用,我需要按照你的建议去做,然后等待它们全部出现。我已经接受了一个答案,现在我对这个项目的问题更多的是rxjs和Redux的放松。但这是一个伟大的解释和展示发电机我将保存这篇文章肯定!凯尔,我很高兴你能从答案中有所收获。没有生成器的第二部分在返回完整的结果数组之前等待所有生成器。祝你今天愉快:D