Многократный асинхронный вызов в каскаде в рекурсивной функции JS - PullRequest
0 голосов
/ 24 апреля 2020

Я уже знаю, что этот вопрос задавался много раз, но я не могу понять, как организовать свой код. Я исхожу из языка C / C ++ и все еще думаю, и то, что я пишу в JS, выглядит «бессмысленным».

Я использую рекурсивную функцию для генерации путешествовать по карте. Дело в том, что мне нужно сделать 2 асинхронных вызова 2 разных API, второй зависит от результата первого.

На самом деле, я всегда использую функции обратного вызова, например:

    function asyncFunction(param, callbackF) {
      // ... //
      $.get(url, function(data, status) {
        callbackF(data, status);
      })
    }

    function asyncFunction2(param, callbackF) {
        // ... //
        $.get(url2, function(data, status) {
          callbackF(data, status);
        })
    }

    function recursiveFunction(param1, param2, num, tab, distance) {
      //.. stuff with parameters //
      asynFunction(param1, function(result, status) {
        // .. stuff with parameters .. //

        //.. Algo stops when distance is 0 ..//
        if(!distance) {
          asyncFunction2(param, function(data, status) {
            // Final stuff //

            return; // End
          });
        }
        else recursiveFunction(param1, param2, num, tab, distance); // parameters has been updated
      });
    }

recursiveFunction(param1, param2, num, tab, distance);

Это работает, но уродливо с большим количеством затейливости, и я не могу в любой момент узнать, не сработала ли эта функция (например, произошел сбой вызова API и т. Д. c).

Вопрос Как я могу ввести Обещания в этом контексте или асинхронные / ожидающие условия в JS? Как я могу превратить этот код в более понятный способ?

Спасибо.

1 Ответ

1 голос
/ 24 апреля 2020

$.get уже возвращает объект типа Promise. Вам просто нужно избавиться от обратных вызовов и вернуть обещание.

function asyncFunction(param) {
  // ... //
  return $.get(url)
}

function asyncFunction2(param) {
    // ... //
    return $.get(url2)
}

Теперь вы можете использовать async/await со своими функциями. Примерно так должно работать

async function recursiveFunction(param1, param2, num, tab, distance) {
  const result = await asyncFunction(param1);
  // .. stuff with parameters .. //

  if(distance) {
    await recursiveFunction(param1, param2, num, tab, distance); // parameters has been updated
  } else {
    await asyncFunction2(param)
  }
}


recursiveFunction(param1, param2, num, tab, distance);
...