Javascript ждать ответа функции - PullRequest
7 голосов
/ 02 сентября 2010

У меня есть следующий код:

myFunc();
bar();

myFunc () делает запрос ajax

Я не хочу выполнять bar (), пока запрос myFunc () не имеетзавершено.

Я также не хочу перемещать вызов bar () внутри myFunc.

возможно?

РЕДАКТИРОВАТЬ

Вот код, с которым я закончил:

var FOO = {
 init: function(blah)
 {
  // Callbacks to pass to the AJAX challenge data load
  var callbacks = {
   myFunc1: function(){ myFunc1(blah); },
   myFunc2: function(){ myFunc2(blah); },
  };

  this.bar(callbacks); // Load the challenge data and setup the game
 },
 bar: function(callbacks) { ..loop through and execute them.. }

};

Ответы [ 4 ]

6 голосов
/ 02 сентября 2010

Чтобы сделать то, что вы ищете, вы должны найти способ для bar () связаться с myFunc () .

Когда вы говорите, что не хотите перемещать вызов на bar () внутри myFunc () , это можно интерпретировать несколькими способами.

Например, вы можете сделать bar () параметром myFunc ()

function bar() {
   // do what bar() does
}

function myFunc(callback) {
   // use callback in the onreadystatechange property of the xmlhtprequest object
}

myFunc(bar)

Надеюсь, это поможет вам

Джером Вагнер

1 голос
/ 02 сентября 2010

ЕСЛИ вы можете добавить своего рода флаг, который будет указывать, что myFunc () завершил свой запрос, вы можете это сделать, но это не очень хорошая идея - рекомендуется использовать обратные вызовы.

Попробуйте этот код:

var successRequest = false;
myFunc(); // when get the response set successRequest to true

var interval = setInterval(function() {
    if (successRequest) {
        clearInterval(interval);
        bar();
    }
}, 100);
0 голосов
/ 02 сентября 2010

Нет, это невозможно.

Этого можно добиться с помощью побочного эффекта, заключающегося в блокировке браузера, сделав запрос SJAX вместо запроса AJAX, но это ужасная идея.*

Научитесь любить программирование, управляемое событиями, когда вы работаете в среде программирования, управляемой событиями.

0 голосов
/ 02 сентября 2010

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

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