可能重复:
How can I get jQuery to perform a synchronous, rather than asynchronous, AJAX request?
how to wait for an ajax call to return
听我说。我完全理解这段代码。
$.getJSON(someURL, function(data){
//do something with my data
})
.success(function () {
//Call what you want on success
})
如果我只需要采取一个非常静态的动作,这似乎很好。但是,如果我想减少限制,例如这个
function my_func(){
$.getJSON(someURL, function(data){
//do something with my data... like modify an array or the dom
})
}
现在是驱动程序
my_func();
//Now I want to call a function that relies on the data that my_func brought into the script.
如果我想这样做,我编写脚本的方式有问题吗?或者我只是错过了一些很棒的内置方法?
答案 0 :(得分:14)
我看到两种可能的jQuery-ish方法。
第一种方法是使用另一个可以传递给my_func
的回调:
function my_func(callback) {
$.getJSON(someUrl, function(data) {
// ...do stuff ...
if ($.isFunction(callback)) { callback(data); }
});
}
my_func(function(data) {
// ..do more stuff..
});
第二种方法是创建一个在my_func
内触发并可以从外部收听的自定义事件:
function my_func() {
$.getJSON(someUrl, function(data) {
$(document).triggerHandler('my_func:data-received', [data]);
});
}
$(document).on('my_func:data-received', function(event, data) {
// ...do stuff...
});
my_func();
我强烈建议仅在绝对必要时才使用async: false
。
另一种(非常简洁的)处理方法是jQuery.Deferred对象:
function my_func() {
var d = new $.Deferred();
$.getJSON(someUrl, function(data) {
d.resolve(data);
});
return d;
}
my_func().done(function(data) {
// ...do stuff...
});
您的函数返回一个允许注册回调的对象。在函数中,您只需要确保调用resolve
来调用所有已注册的done
回调处理程序。
答案 1 :(得分:2)
然后是XHR对象:
var jqXHR = $.getJSON(someURL);
您可以在定义后随时随地访问它:
jqXHR.always(function() {
alert('JSON IS COMLETE');
});
jqXHR.done(function(data) {
//do something with the returned data if success!
});
jqXHR.fail(function(jqXHR, textStatus) {
alert('JSON FAILED : '+textStatus);
});
你甚至可以这样做:
$("#button").on('click', Myfunc);
function Myfunc() {
var jqXHR = runAjax();
jqXHR.done(function(data) {
alert($.parseJSON(data));
$("#result").html('JSON IS DONE');
});
}
function runAjax() {
return $.getJSON(someURL);
}
答案 2 :(得分:1)
您可能会将运行数据的函数传递给my_func()
。
// v--------receive a callback
function my_func(callback_fn){
$.getJSON(someURL, callback_fn); // use the callback as the getJSON callback
}
...然后
my_func(function(data) {
// do something with data
})
...或者如果你想要调用的函数是一个命名函数,那么你当然会按名称传递它...
my_func(someOtherFunction)
无论哪种方式,您的my_func()
函数都会将其用作$.getJSON
调用的回调函数,该调用将在数据到达时调用它。