$(function() {
var r = GetResults();
for(var i = 0; i < r.length; i++) {
// Do stuff with r
}
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
return data;
});
}
由于我正在异步调用方法,脚本会继续执行,当遇到for循环时,r
显然不会有值。我的问题是:当我有一个正在进行异步操作的方法,并且我依赖于它在主块中返回的数据时,如何在数据返回之前暂停执行?类似的东西:
var r = GetResults(param, function() {
});
其中函数是回调函数。我无法将for循环处理移动到JSON请求的回调函数中,因为我在整个页面中多次重用GetResults的功能,除非我想复制代码。有什么想法吗?
答案 0 :(得分:13)
将您的“使用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;
});
}
答案 1 :(得分:7)
Ajax已经给你一个回调,你应该使用它:
function dostuff( data ) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
};
$(document).ready( function() {
$.getJSON( "/controller/method/", null, dostuff );
});
答案 2 :(得分:7)
以下是我的工作示例:
$.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;
}
});
答案 3 :(得分:3)
你可以这样做:
$(function() {
PerformCall();
});
function PerformCall() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}
答案 4 :(得分:2)
简短的回答是你不能阻止异步操作......这当然是“异步”的意思。
相反,您需要更改代码以使用回调来根据$.getJSON(...)
调用返回的数据触发操作。以下内容应该有效:
$(function() {
GetResults();
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}
答案 5 :(得分:2)
鉴于您的更新要求......
我无法移动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编程模型作斗争。 :)
答案 6 :(得分:0)
这是不可能的。
要么使您的功能同步,要么更改代码设计以支持异步操作。
答案 7 :(得分:0)
将数据处理移动到回调中:
$(function() {
GetResults();
});
function GetResults() {
$.getJSON("/controller/method/", null, function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
}
答案 8 :(得分:0)
您可以使用适当的参数进行回调...
$(function() {
GetResults(function(data) {
for(var i = 0; i < data.length; i++) {
// Do stuff with data
}
});
});
function GetResults(func) {
$.getJSON("/controller/method/", null, func);
}