使用非jQuery ajax延迟jQuery

使用非jQuery ajax延迟jQuery,jquery,ajax,jquery-deferred,promise,Jquery,Ajax,Jquery Deferred,Promise,我有一个从多个源提取数据的应用程序,只有当所有数据都被提取时,我才想继续。我希望数据尽可能快,所以使用并行请求 要确定所有请求何时完成,我将执行以下操作: function getData(cb) { var count, data; count = 0; data = {}; function getDataDone() { count++; //only call callback when all async reque

我有一个从多个源提取数据的应用程序,只有当所有数据都被提取时,我才想继续。我希望数据尽可能快,所以使用并行请求

要确定所有请求何时完成,我将执行以下操作:

function getData(cb) {

    var count, data;

    count = 0;
    data = {};

    function getDataDone() {
        count++;
        //only call callback when all async requests are done
        if (count === 3 && cb) {
            cb(data);
        }
    }

    foo.doAsync({
        success: function (d) {
            data.foo = d;
            getDataDone();
        }
    });

    bar.doAsync({
        success: function (d) {
            data.bar = d;
            getDataDone();
        }
    });

    $.getJSON("/api/", function (d) {
        data.user = d;
        getDataDone();
    });

} //end getData


getData(function (data) {

    //application data loaded, do stuff
    data.foo;
    data.bar;
    data.user;

});
foo.doAsync
bar.doAsync
$。getJSON
请求是并行的,完成后,它们调用
getDataDone()
,这会增加一个计数器。如果计数器等于预期的请求数,请运行回调

在这种情况下如何应用jQuery.deferred?编写代码的工作是完全正常的。使用延期付款有什么好处吗

var d1 = $.Deferred();
foo.doAsync({
    success: function (d) {
        data.foo = d;
        d1.resolve();
    }
});

var d2 = $.Deferred();
bar.doAsync({
    success: function (d) {
        data.bar = d;
        d2.resolve();
    }
});

var json_deferred = $.getJSON("/api/", function (d) {
    data.user = d;
    getDataDone();
});

$.when(d1, d2, json_deferred).then(function() {
    alert('all requests finished');
});
使用延期付款有什么好处吗

var d1 = $.Deferred();
foo.doAsync({
    success: function (d) {
        data.foo = d;
        d1.resolve();
    }
});

var d2 = $.Deferred();
bar.doAsync({
    success: function (d) {
        data.bar = d;
        d2.resolve();
    }
});

var json_deferred = $.getJSON("/api/", function (d) {
    data.user = d;
    getDataDone();
});

$.when(d1, d2, json_deferred).then(function() {
    alert('all requests finished');
});
是的,延迟允许对应用程序流程进行更多控制,并且通常(本例并非例外)提供更清晰的解决方案

提示:如果您只需要回调中异步请求的结果,而不需要其他内容,则可以将结果传递给
resolve
调用,如
d1.resolve(d)then()
回调的参数获取,而不是将共享对象用作临时存储

如果使用
getJSON()
,甚至可以忽略回调:

var json_deferred = $.getJSON('/api/');
使用jQuery.when:您可以等待几个承诺完成

您可以将
doAsync()
方法包装在promises中

:

产生:

您还可以从getData返回承诺,而不是传入回调。

我只需要提示中的部分:。伟大的