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 を返す必要があります。次に、データを処理するコールバックを約束に提供します

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 に答える