2012-03-08 3 views
1

Это может быть противоположность my previous question here, но в любом случае мне также нужно знать его ответ.Каков наиболее эффективный способ ожидания вызова асинхронной функции в Javascript?

У меня есть вызов Ajax в моем алгоритме, что мне нужно дождаться его запуска кода. Есть два решения:

1) Типичное решение:

ajaxCall(function(result){ 
    //the code to run after the call is returned 
}); 

2) Тот, мне интересно, если это может быть альтернативой:

res=null; 
ajaxCall(function(result){ 
    res=result; 
}); 
while(res==null)/*wait! but this will lock the GUI I guess*/; 
//do the rest of the code because now res is initialized 

Вопрос заключается в том, как я могу написать второе решение эффективным способом, который не задерживает графический интерфейс?

+2

Просто сделать синхронный вызов Ajax. ref: https://developer.mozilla.org/en/XMLHttpRequest искать параметр async. – Yoshi

+0

Синхронные запросы по-прежнему блокируют графический интерфейс. –

+1

@ AndyE Конечно, в этом суть асинхронизации и синхронизации. Но это все же лучше, чем бесконечный цикл. – Yoshi

ответ

2

Я предлагаю подключить все зависимые коды для выполнения в качестве обратного вызова из возврата вашего ajax-вызова. Таким образом, все остальные javascript могут продолжать выполняться, и вы не будете делать ваш браузер безответным в течение всего времени вызова.

В качестве альтернативы, которые не то, что я никогда бы не сделать, вы можете сделать свой вызов Ajax синхронно, используя async: false так:

$.ajax({ url: ..., async: false }); 
+0

В этом решении используется JQuery, что приемлемо. Тем не менее, ответ Йоши отмечен как окончательный ответ, потому что он использует чистый Javascript. – AlexStack

0

Есть много способов сделать это. один из которых передает обратный вызов ajax (или, по крайней мере, ссылку на него). Например, ваш код №1.

еще есть то, что у вас есть объект-уведомитель, который вы добавляете к нему вызов ajax. то у вас могут быть другие функции (один или несколько), подключаемых к нему, для прослушивания объявления «Успех».

1

Общий ответ:

Есть только два доступных методов в асинхронном. программирование: события и обратные вызовы. Период.

(Технически говоря, на самом деле нет разницы между двумя на низшем уровне, «событие» - это просто функция (библиотека) - тот, который делает событие «стрельба» - выполнение всех функций, зарегистрированных в качестве слушателей так что это то же самое, что и обратный вызов - технически, т. е. когда вы пишете event.fire() или независимо от синтаксиса события предпочтительной библиотеки, это синхронный вызов всех зарегистрированных функций обработчика событий). Когда использовать тот или иной вариант - это предпочтение, соглашение и стиль при разработке API.)

+0

Я предполагаю, что события запускаются в другом потоке. – AlexStack

+1

Нет, нет нитей! Pls. читать «цикл событий» (google) :-) –

+0

интересно, поэтому весь код Javascript работает в одном потоке, поэтому код Javascript является «потокобезопасным» по своей природе? – AlexStack

1

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

Пример Callbacks спагетти:

function ajaxRequest(url1, function() { 
    animateSomething(div, function() { 
     ajaxRequest(url2, function() { 
      .... 
     }) 
    }) 
}) 

то же самое с async.js выглядит гораздо чище:

async.series([ 
    function(_) { ajaxRequest(url1, _) }, 
    function(_) { animateSomething(div, _) }, 
    function(_) { ajaxRequest(url2, _) } 
])