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

时间:2012-03-10 14:55:58

标签: javascript jquery ajax

  

可能重复:
  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.

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

3 个答案:

答案 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);
});

FIDDLE

你甚至可以这样做:

$("#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);
}

FIDDLE

答案 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调用的回调函数,该调用将在数据到达时调用它。