可能重复:
如何让jQuery执行同步而非异步的AJAX请求?
如何等待ajax调用返回
听我说。我完全理解这段代码。
$.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.
如果我想这样做,我编写脚本的方式有问题吗?或者我只是错过了一些很棒的内置方法?
我看到两种可能的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
回调处理程序。
然后是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);
}
小提琴
您可能会将运行数据的函数传递给 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
call,将在数据到达时调用它。