Есть ли способ приостановить сценарий до завершения закрытия JavaScript? JavaScript, JQuery, AJAX - PullRequest
0 голосов
/ 10 октября 2011

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

Пример:

var myVari = someFunction();
$.each(myVari, function(){/*code for each*/});

функция, которая определяет myVari, является вызовом AJAX, который может занять секунду или 4 (да, это не быстро), чтобы определить переменную.Проблема в том, что до того, как вызов AJAX даст свои результаты, $ .each уже сработал и допустил ошибку из-за пустого значения myVari.Есть ли лучший способ приблизиться к этому сценарию?

Ответы [ 4 ]

6 голосов
/ 10 октября 2011

Вы должны адаптировать свой код так, чтобы вы могли передавать обратный вызов на someFunction, который вы выполняете, когда завершен вызов AJAX.

Единственный способ ждать дляЧтобы завершить AJAX-вызов, нужно изменить его на синхронный, но это сильно не рекомендуется, поскольку он полностью блокирует браузер на время вызова AJAX.

Поскольку вы уже используете библиотеку jQuery, этот процесс callbacks становится намного проще.Вместо того, чтобы возвращать переменную, как в данный момент, я бы возвратил объект jQuery AJAX (, который имеет интерфейс обещаний с 1.6 ), так что вы можете легко добавить к нему обратные вызовы:

function someFunction () {
    return jQuery.ajax('some/url.php', {
        // whatever
    });
}

var myVari = someFunction();
myVari.done(function (data) {
    $.each(data, function(){/*code for each*/});
});
3 голосов
/ 10 октября 2011

Если я понимаю, что вы пытаетесь сделать, тогда вы можете попробовать ваш $ .each в обработчике 'success' вашего ajax-вызова.

Переписать someFunction в нечто вроде -

var myVari; //define this here or in whichever calling scope where it needs to be available.
$.ajax({
    'url': 'http://..',
    'type': 'GET', // or POST
    'data': { } // whatever data you need to send
    'success': function(data) {
        myVari = process_the_server(data);
        $.each(myVari, function() {...});
    }
});
1 голос
/ 10 октября 2011

Используйте обратный вызов, например:

someFunction(function(myVari) {
    $.each(myVari, function(){ /*code for each*/ });
});

Затем переопределите someFunction следующим образом:

function someFunction(callback) {
    var myVari;

    /* ... */
    /* calcuate myVari */
    /* ... */

    /* instead of returning it, pass it to the callback: */
    callback(myVari);
}
0 голосов
/ 10 октября 2011

Правильный путь таков: вместо того, чтобы запускать each самостоятельно, запустите его внутри вызова ajax.

Вы можете, я полагаю, сделать:

function checkFunc() {
  setTimeout(function() {
    if(myVari) {
      $.each(........);
    } else {
      checkFunc();
    }
  }, 1000);
}

Это недействительно хорошая практика кодирования, но она будет работать.

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