Приостановка до обратного вызова, в Javascript - PullRequest
2 голосов
/ 30 июня 2010

Я довольно плохо знаком с программированием в стиле callback в javascript.Есть ли способ заставить код ждать, пока вызов функции не завершится через обратный вызов?Позволь мне объяснить.Следующая функция берет число и возвращает результат на его основе.

function get_expensive_thing(n) {
  return fetch_from_disk(n);
}

Пока все достаточно просто.Но что мне делать, когда fetch_from_disk вместо этого возвращает свой результат через обратный вызов?Например:

function get_expensive_thing(n) {
  fetch_from_disk(n, function(answer) {
    return answer; // Does not work
  });
}

Выше не работает, потому что return входит в область действия анонимной функции, а не функции get_expensive_thing.

Существует два возможных«решения», но оба неадекватны.Одним из них является рефакторинг get_expensive_thing для себя ответа с обратным вызовом:

function get_expensive_thing(n, callback) {
  fetch_from_disk(n, function(answer) {
    callback(answer);
  });
}

Другой заключается в перекодировании fetch_from_disk, но это не вариант.

Как мы можем достичьжелаемый результат при сохранении желаемого поведения get_expensive_thing - т. е. подождать, пока fetch_from_disk не вызовет обратный вызов, а затем вернуть этот ответ?

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

В браузере Javascript практически нет ожидания. Все дело в обратных вызовах. Помните, что ваши обратные вызовы могут быть «замыканиями», что означает определения функций, которые «захватывают» локальные переменные из контекста, в котором они были созданы.

Вы станете счастливее, если вы воспользуетесь этим способом.

0 голосов
/ 30 июня 2010

добавьте пропущенное возвращение:)

function get_expensive_thing(n) {
  return fetch_from_disk(n, function(answer) {
    return answer;
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...