2014-01-03 5 views
0

У меня возникла проблема с моим кодом. У меня есть функция, выполняющая вызов AJAX и выводящий интерфейс, и что AJAX разделен на другую функцию. Я называю это где-то, и за ним следует какой-то код. Вот пример:Выполнение запроса ajax в javascript синхронно?

function doAjaxStuff(){ 
//do something 
} 

function anotherFunction(){ 
doAjaxStuff(); 
//proceed with further code 
} 

(Функция anotherFunction становится вызывается из $(document).ready)

В дальнейшем код полностью зависит от вещей, которые я загружаю, как я пытаюсь доступ к элементу и он еще не загружен, что дает мне нулевое значение, и ничего не работает. Поэтому, если бы я мог просто ждать, пока функция, которую я вызвал в anotherFunction, будет выполнена полностью, тогда мне было бы легче справиться с ней. Я видел promises, если я не ошибаюсь, помогает сделать код синхронным (неспособным понять, как его реализовать). Выручи меня!

+1

Пожалуйста, прочитайте документацию. Вы даже знаете слово, которое ищете. Будьте очень осторожны, что ajax-вызовы, которые вы выполняете синхронно, и рассмотрите возможность асинхронного использования с функцией успеха. Это не остановит работу вашего javascript. – Sumurai8

+0

Да, вызов ajax успешно загружает интерфейс. Но я пытаюсь получить доступ к элементу, загруженному этим ajax-вызовом 'getElementById', который отлично работает на firefox, но в chrome он дает нулевое значение. –

+0

Мне нужно будет увидеть код, чтобы выяснить, что может пойти не так. Ответ Гильерме должен работать нормально, если вы переместите весь код, зависящий от ajax-вызова в этой функции успеха. – Sumurai8

ответ

1

Другой способ заключается в использовании deferred объекты

function doAjaxStuff(){ 
    return $.ajax(...); 
} 


function anotherFunction() { 
    $.when(doAjaxStuff()).then(function(){ 
     // other code to run after ajax call 
    }); 
} 
+0

Я попытался реализовать на первом месте. Не хватило удачи, чтобы все исправить. Спасибо, что, наконец, работает сейчас, и это имеет смысл :) –

0

попробовать что-то вроде этого

 $.ajax({ 
     url:"demo_test.txt", 
     async:false, 
     success:function(result){ 
     } 
    }); 

все запросы посылаются асинхронно (т.е. это устанавливается истина по умолчанию). Если вам нужны синхронные запросы, установите этот параметр в ложном

ССЫЛКА

http://api.jquery.com/jquery.ajax/

+0

Мне не нужен синхронный запрос на сервер, но мне нужно выполнить эту часть ajax и только после этого перейти к следующему коду после вызова функции. –

+1

Я предлагаю не использовать это, поскольку синхронные запросы ajax блокируют пользовательский интерфейс, пока на сервере нет ответа. –

+0

Я просто хочу, чтобы вызов 'doAjaxStuff' заканчивался первым, а затем он должен продолжить код, который ниже вызова. –

3

Вы можете передать функцию обратного вызова в качестве аргумента doAjaxStuff и назвать его, когда запрос Ajax делается.

function doAjaxStuff(callback) { 
    $.ajax({ 
     success: function(data) { 
      // do some stuff with data 
      callback(data); 
     } 
    }); 
} 

function anotherFunction() { 
    doAjaxStuff(function(data) { 
     alert(data); 
    }) 
} 

В JavaScript функции также являются объектами, а это означает, что они могут быть переданы в качестве аргумента другой функции, а также вы можете сделать с любым другим значением. Таким образом, в этом случае мы имеем параметр callback в функции doAjaxStuff. Когда запрос ajax будет завершен, мы можем вызвать эту функцию, которая была передана как аргумент.

+0

Как это работает, вы можете объяснить мне немного об этом? –

+0

@Cruze Я добавил еще несколько объяснений в конце сообщения, возможно, это может немного разъяснить. –

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