Асинхронная функция Javascript: короткое замыкание вверху с возвратом - PullRequest
1 голос
/ 18 февраля 2012

У меня есть асинхронная функция, которая проверяет несколько вещей и запускает себя снова и снова, используя setTimeout и queue.pop ().После того, как некоторая логика верна, мне не нужно, чтобы функция продолжала работать и продолжала вызывать себя, даже если какой-то элемент остается в очереди.Итак, в какой-то момент у меня есть такое утверждение:

if (isWhatIneed(currentItem)) {
   completed = true;
   return;
}

Я получил то, что искал.Проблема в том, что с тех пор в очередь поступает больше элементов, и она продолжает выполняться асинхронно.Поэтому, чтобы исправить это, я добавил в самый верх этой функции:

if (completed) {
  console.log("already completed");
  return;
}

Это предотвращает дальнейшее выполнение каждого выполнения в стеке вызовов (особенно, чтобы не выталкивать больше элементов из очереди ипродолжайте работать).

Мой вопрос: я прочитал, используя несколько выражений возврата esp.на вершине функции плохая практика.Но в этом случае вы видите другой способ сделать это?Я мог бы обернуть все тело своей функции, если (! Завершено) {// ...}, но мне это кажется уродливым, потому что отступает все тело, а ранний возврат - нет.

Спасибо,

1 Ответ

1 голос
/ 18 февраля 2012

Нет проблем в использовании нескольких операторов возврата, особенно в случаях такого типа.

Например, return может быть значением, в этом случае вы можете просто проверить, была ли функция успешной или другие сообщения об ошибках.

Нет проблем со скоростью, если у вас есть несколько операторов return внутри функции, а также с проблемой следования путям кода, так что вы не используете переход, поэтому в этом методе нет проблем. Функция вернется туда, куда вы ее вызвали, не на другой строке. (пожалуйста, реализуйте рекурсивный алгоритм обратного отслеживания без использования нескольких возвратов, это неосуществимо);

Поэтому я предлагаю использовать множественные операторы возврата, не беспокоясь.

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