Несколько условных обратных вызовов в JavaScript - PullRequest
0 голосов
/ 13 мая 2018

У меня есть асинхронная функция, которая может вызывать или не вызывать некоторые другие асинхронные функции и должна вызывать ее обратный вызов, когда все дочерние функции выполнены.Я не доволен тем, что я придумал, и чувствую, что должен быть более легкий путь.Как правильно это сделать (без библиотек)?

function fn(callback)
{
  let pendingOperations = 0;

  if (condition1)
  {
    ++pendingOperations;
  }

  if (condition2)
  {
    ++pendingOperations;
  }

  if (pendingOperations === 0)
  {
    callback();
  }
  else
  {
    if (condition1)
    {
      otherFunction1(() =>
      {
        if (--pendingOperations <= 0)
        {
          callback();
        }
      });
    }

    if (condition2)
    {
      otherFunction2(() =>
      {
        if (--pendingOperations <= 0)
        {
          callback();
        }
      });
    }
  }
}

1 Ответ

0 голосов
/ 13 мая 2018

Используйте Promise с для этого вида работ:

function fn(callback) {
    let promises = [];
    if (condition1) {
        promises.push(new Promise(resolve => otherFunction1(resolve)));
    }
    if (condition2) {
        promises.push(new Promise(resolve => otherFunction2(resolve)));
    }

    Promise.all(promises).then(callback);
}

Если promises пусто (из-за сбоя как condition1, так и condition2), то обещание, возвращаемое Promise.all(promises), будет разрешено немедленно и, следовательно, callback будет вызвано немедленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...