jQuery: ожидать функции для завершения, чтобы продолжить обрабатывать?

Я должен признать, что не знаю Java. Но действительно ли эти два эквивалентны? Действительно ли объектное время жизни является тем же? В первом примере я принимаю (не знание Java), что o будет сразу иметь право на сборку "мусора", цикл завершается.

, Но во втором примере, конечно, o не будет иметь право на сборку "мусора", пока из внешнего объема (не показанный) не выйдут?

17
задан Crescent Fresh 21 September 2009 в 19:52
поделиться

9 ответов

переместите блок «делать что-то с r» в обратный вызов $ .getJSON. вы не можете делать что-то с r, пока оно не будет доставлено, и первая возможность, которую вам придется использовать r, - это обратный вызов ... так что сделайте это тогда.

$(function() {
    var r = GetResults();  
});

function GetResults() {
   $.getJSON("/controller/method/", null, function(data) {
       for(var i = 0; i < data.length; i++) {
           // Do stuff with data
       }
       return data;
   });
}
13
ответ дан 30 November 2019 в 12:07
поделиться

Ajax уже предоставляет обратный вызов, вы должны его использовать:

function dostuff( data ) {
    for(var i = 0; i < data.length; i++) {
        // Do stuff with data
    }
};
$(document).ready( function() {
    $.getJSON( "/controller/method/", null, dostuff );
});
7
ответ дан 30 November 2019 в 12:07
поделиться

Я уже сталкивался с чем-то похожим раньше. Вам нужно будет запустить вызов ajax синхронно.

Вот мой рабочий пример:

$.ajax({
    type: "POST",
    url: "/services/GetResources",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: '{resourceFileName:"mapedit",culture:"' + $("#lang-name").val() + '"}',
    cache: true,
    async: false, // to set local variable
    success: function(data) {
        localizations = data.d;
    }
});
7
ответ дан 30 November 2019 в 12:07
поделиться

Вы можете сделать это:

$(function() {
    PerformCall();        
});

function PerformCall() {
   $.getJSON("/controller/method/", null, function(data) {
       for(var i = 0; i < data.length; i++) {
        // Do stuff with data
       }
   });
}
3
ответ дан 30 November 2019 в 12:07
поделиться

Короткий ответ заключается в том, что вы не можете заблокировать асинхронную операцию ... что, конечно, означает «асинхронная».

Вместо этого вам нужно изменить свой код, чтобы использовать обратный вызов для запуска действие на основе данных, возвращенных вызовом $. getJSON (...) . Должно получиться что-то вроде следующего:

$(function() {
  GetResults();
});

function GetResults() {
  $.getJSON("/controller/method/", null, function(data) {
    for(var i = 0; i < data.length; i++) {
      // Do stuff with data
    }
  });
}
2
ответ дан 30 November 2019 в 12:07
поделиться

Учитывая ваши обновленные требования ...

Я не могу переместить обработку цикла for в функцию обратного вызова JSON запрос, потому что я повторно использую функциональность GetResults несколько время на странице, если я не хочу продублировать код. Есть идеи?

... вы можете изменить GetResults () , чтобы принимать функцию в качестве параметра, который затем вы выполняете как обратный вызов $. GetJSON (предупреждение о воздушном коде ):

$(function() {
    GetResults(function(data) {
        for(var i = 0; i < data.length; i++) {
            // Do stuff with data
        }
    });
});

function GetResults(callback) {
   $.getJSON("/controller/method/", null, callback);
}

Как видно из общего потока ответов, лучше не пытаться бороться с асинхронной моделью программирования jQuery. :)

2
ответ дан 30 November 2019 в 12:07
поделиться

Это невозможно.

Либо вы сделаете свою функцию синхронной, либо измените структуру кода для поддержки асинхронной операции.

0
ответ дан 30 November 2019 в 12:07
поделиться

У вас может быть обратный вызов с параметрами, которые должны работать нормально ...

$(function() {
    GetResults(function(data) {
      for(var i = 0; i < data.length; i++) {
        // Do stuff with data
      }
    });

});

function GetResults(func) {
   $.getJSON("/controller/method/", null, func);
}
0
ответ дан 30 November 2019 в 12:07
поделиться

Переместите обработку данных в обратный вызов:

$(function() {
    GetResults();
});

function GetResults() {
   $.getJSON("/controller/method/", null, function(data) {

       for(var i = 0; i < data.length; i++) {
           // Do stuff with data
       }
   });
}
0
ответ дан 30 November 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: