正确的等待ajax返回的方法(我不想使用成功处理程序.)

Jak*_*ake 12 javascript ajax jquery

可能重复:
如何让jQuery执行同步而非异步的AJAX请求?
如何等待ajax调用返回

听我说.我完全理解这段代码.

$.getJSON(someURL, function(data){
    //do something with my data
})
.success(function () {
    //Call what you want on success
})
Run Code Online (Sandbox Code Playgroud)

如果我只需要采取一个非常静态的动作,这似乎很好.但是,如果我想减少限制,例如这个怎么办?

function my_func(){
    $.getJSON(someURL, function(data){
        //do something with my data... like modify an array or the dom
    })
}
Run Code Online (Sandbox Code Playgroud)

现在是司机

my_func();
//Now I want to call a function that relies on the data that my_func brought into the script.
Run Code Online (Sandbox Code Playgroud)

如果我想这样做,我编写脚本的方式有问题吗?或者我只是错过了一些很棒的内置方法?

Nik*_*iko 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..
});
Run Code Online (Sandbox Code Playgroud)

第二种方法是创建一个内部触发的自定义事件,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();
Run Code Online (Sandbox Code Playgroud)

我强烈建议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...
});
Run Code Online (Sandbox Code Playgroud)

您的函数返回一个允许注册回调的对象.在函数中,您只需要确保调用resolve以调用所有已注册的done回调处理程序.


归档时间:

查看次数:

8270 次

最近记录:

13 年,10 月 前