如何在一个取值请求链中递归调用一个取值请求。

问题描述 投票:1回答:1

我正在做一个使用node.js和express的web应用,使用node-fetch模块。以下是我的代码的关键部分的片段

fetchGeoLocation(geoApiKey)
.then(coordinates => {
   data x = getSomeData(); //returns data needed for next fetch API call.

   return fetchWithRetry(//various parameters provided by var data...);

}
.then(powerData =>{
   ///continue on...

}

对于一些上下文:fetchWithRetry接收面积作为参数并输出电功率。它是递归的,因为输出的功率必须低于某个阈值。如果它低于这个阈值,则返回该值,否则,fetchWithRetry()将以改变的输入参数再次调用。

这是我的fetchWithRetry()函数的重要部分。

function fetchWithRetry(params...){
   return fetch(///powerData)
   .then(res => res.json())
   .then(powerData => {

    if( //powerData isn't good){
       fetchWithRetry(change params...)
    }
    return powerData;

TL;DR-->下面就是具体的问题。

最后一个回调,powerData,并没有等待fetchWithRetry的结果,以及它在递归调用后的潜力。我已经验证了fetchWithRetry工作正常,但递归调用是在最后一个.then()调用之后进行的,因此它没有等待它。

我已经尝试使用asyncawait来获取坐标和fetchWithRetry,但最后一个.then()仍然没有等待递归调用完成。

node.js express asynchronous recursion fetch
1个回答
0
投票

你只是忘记了 return 递推 fetchWithRetry. 下面是一个例子。

const timeOutPromise = (i)=>{
  return new Promise((res)=>{
    setTimeout(() => {
      res(i)
    }, 100);
  })
}

function fetchWithRetry(i){
  return timeOutPromise(i)
  .then(d=>{
    process.stdout.write(d+" ");
    if(d<10){
      return fetchWithRetry(d+1)
    }else{
      return d
    }
  })
}

fetchWithRetry(0).then((d)=>{
  console.log("\nThe Latest Value: ",d);
  console.log("done");
})

结果是:

0 1 2 3 4 5 6 7 8 9 10 
The Latest Value:  10
done
© www.soinside.com 2019 - 2024. All rights reserved.