Javascript 使用多个$.getJSON调用时从$

Javascript 使用多个$.getJSON调用时从$,javascript,jquery,deferred,Javascript,Jquery,Deferred,在下面的代码中,我使用$.getJSON(从存储库返回)和$检索数据。当上次调用依赖于第一次调用的数据时,: var getData = function () { var data = { userData: null, userTitles: null, userPage: null }; $.when(repository.getUserDetails().done(f1)), repository.ge

在下面的代码中,我使用
$.getJSON
(从存储库返回)和
$检索数据。当上次调用依赖于第一次调用的数据时,

var getData =

    function () {

        var data = { userData: null, userTitles: null, userPage: null };

        $.when(repository.getUserDetails().done(f1)),
                    repository.getUserPolicyTitles().done(f2)
            .then(repository.getUserPage().done(f3));


        function f1(userData) { data.userData = userData; console.log(data.userData) };
        function f2(userTitles) { data.userTitles = userTitles; console.log(data.userTitles) };
        function f3(userPage) { data.userPage = userPage; console.log(data.userPage) };

        return data;
    }

   return {
       getData: getData
   };
大部分都很好。但是,我希望将数据返回给调用模块,但它会在数据准备就绪之前返回,正如我所想的那样

实现这一目标的最佳方式是什么

谢谢


Davy

当使用$时。当,只有在所有AJAX调用返回后才能获取数据。例如:

$.when($.getJSON('somewhere'), $.getJSON('somewhere2'))
.done(function(r1, r2){
    //set your data object with the responses from the server here
});

因此,简单的回答是,您不能“返回”从服务器检索到的数据,但您可以在数据准备就绪时分配回调以使用数据(或设置为模块的某个实体)。

您对延迟的使用似乎不正确。这是我的解释

还需要考虑的是,一旦你开始调用异步方法,你就不能同步调用,这就是你正在做的。您需要返回承诺,而不是返回数据;然后,您提供了一个回调,该回调将处理数据

var getData = function () {
    var myDeferred = $.Deferred();
    var data = { userData: null, userTitles: null, userPage: null };

    $.when(repository.getUserDetails().done(f1),
           repository.getUserPolicyTitles().done(f2),
           repository.getUserPage().done(f3)).then(
        function(){ myDeferred.resolve(data); },
        function(){ myDeferred.reject.apply(myDeferred, arguments); });

    //... f1, f2, f3

    return myDeferred.promise();
}

return {
    getData: getData
};
然后,当您想要实际使用数据时,您可以

your_library.getData().then(function(data){
        // magic goes here
    }, function(errors_of_some_sort) {
        // error handling magic goes here
    });

$.when()
表达式没有意义。它有一个参数,后面跟着一个
。你确定括号
()
放在正确的位置吗?谢谢,我想文档中说你可以将多个函数传递到$。when-基本上是在执行$中的第三个函数之前执行这两个函数。然后。谢谢你的解释。我也试过类似的东西,但不能把它们全部放在一起。