2010-06-29 4 views
2

Я довольно новичок в обратном обращении к программированию в javascript. Есть ли способ для force код для ожидания завершения вызова функции через обратный вызов? Позвольте мне объяснить. Следующая функция принимает число и возвращает результат на основе этого.Приостановка до вызова обратного вызова, в 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

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

Вы станете более счастливым человеком, если вы примете этот способ делать что-то.

+0

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

+0

Это справедливо. Моя цель заключалась в том, чтобы установить, что на самом деле * невозможно * создать функцию, которая возвращает значение, полученное с помощью обратного вызова. – jameshfisher

0

добавить в этом пропавшем возвращения :)

function get_expensive_thing(n) { 
    return fetch_from_disk(n, function(answer) { 
    return answer; 
    }); 
} 
+0

Возможно, я не делал этого ясно: в этом примере «fetch_from_disk» изменил свой режим, чтобы вместо этого вернуть результат через обратный вызов. Поэтому его возвращаемое значение фактически «неопределено». – jameshfisher

+0

вы ясно дали понять, но многие люди также возвращают результат обратного вызова, подумайте о fetch_from_disk (n, c) {return c (val)} - извинения, если это был шум :) – nathan

Смежные вопросы