1

在以下代码中,我正在使用$.getJSON(从存储库返回)检索数据,$.when因为最后一次调用取决于第一次调用的数据:

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
   };

其中大部分工作正常。但是,我想将数据返回给调用模块,但它会在数据准备好之前返回,正如我想你所期望的那样。

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

谢谢

戴维

4

2 回答 2

2

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

此外,您需要考虑,一旦您开始调用异步方法,就无法进行同步返回调用,这就是您正在做的事情。您需要返回一个promise,而不是返回数据;然后你为 promise 提供一个回调来处理数据

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
    });
于 2013-01-12T01:08:32.423 回答
0

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

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

所以简短的回答是你不能“返回”你从服务器检索到的数据,但是当数据准备好时,你可以分配一个回调来使用数据(或设置为你的模块的某个实体)。

于 2013-01-12T01:02:01.273 回答