Как рекурсивно вызвать один запрос на выборку в цепочке запросов на выборку - PullRequest
1 голос
/ 01 мая 2020

Я создаю веб-приложение node.js и express, которое использует модуль извлечения узла. Ниже приведен фрагмент ключевых частей моего кода

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 (), поэтому он не ждет его.

Я попытался использовать async / await для координат и fetchWithRetry но последний .then () продолжает не ждать рекурсивного вызова fini sh.

1 Ответ

0 голосов
/ 02 мая 2020

Вы только забыли 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
...