Я должен признать, что не знаю Java. Но действительно ли эти два эквивалентны? Действительно ли объектное время жизни является тем же? В первом примере я принимаю (не знание Java), что o будет сразу иметь право на сборку "мусора", цикл завершается.
, Но во втором примере, конечно, o не будет иметь право на сборку "мусора", пока из внешнего объема (не показанный) не выйдут?
переместите блок «делать что-то с 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;
});
}
Ajax уже предоставляет обратный вызов, вы должны его использовать:
function dostuff( data ) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
};
$(document).ready( function() {
$.getJSON( "/controller/method/", null, dostuff );
});
Я уже сталкивался с чем-то похожим раньше. Вам нужно будет запустить вызов 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;
}
});
Вы можете сделать это:
$(function() {
PerformCall();
});
function PerformCall() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}
Короткий ответ заключается в том, что вы не можете заблокировать асинхронную операцию ... что, конечно, означает «асинхронная».
Вместо этого вам нужно изменить свой код, чтобы использовать обратный вызов для запуска действие на основе данных, возвращенных вызовом $. getJSON (...)
. Должно получиться что-то вроде следующего:
$(function() {
GetResults();
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}
Учитывая ваши обновленные требования ...
Я не могу переместить обработку цикла 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. :)
Это невозможно.
Либо вы сделаете свою функцию синхронной, либо измените структуру кода для поддержки асинхронной операции.
У вас может быть обратный вызов с параметрами, которые должны работать нормально ...
$(function() {
GetResults(function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
});
function GetResults(func) {
$.getJSON("/controller/method/", null, func);
}
Переместите обработку данных в обратный вызов:
$(function() {
GetResults();
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}