1

ドキュメントを正しく読んでいるかどうかはわかりませんが、jquery で $.when を使用すると、複数の非同期呼び出しを実行でき、関数のdone一部で別の関数を呼び出すことができると思いました。私は基本的に、ビューをレンダリングする前にすべてのデータを取得しようとしています。一部のアイテムはバックボーン オブジェクトにあり、情報に対応するバックボーン オブジェクトがないため、ajax 呼び出しで手動で呼び出す必要があるものもあります。

var fetchLibraries = function () {
      if (this.screen == "EDIT") {
                    $.ajax({
                        url: 'libraries',
                        type: "GET",
                        crossDomain: $.support.cors,
                        xhrFields: {
                            withCredentials: $.support.cors
                        },
                        success: function (data) {
                            console.log(data);
                            // do some processing with the data that can take some time
                        }
                    });
                }
               }
            };

            $.when(this.platforms.fetch(),
                fetchLibraries()).done(function () {
                self.trigger('removeOverlay');
                self.render();
            });

通常、これは期待どおりに機能し、fetchLibraries の成功コールバックの後にレンダリング関数が呼び出されます。通常、サーバーが起動していて呼び出しに時間がかかる場合、fetchLibraries の処理が完了する前に self.render() が呼び出されることがあります。self.render 関数と成功コールバックの両方に console.log があります。機能しない場合、基本的に「データ」がログに記録される前に「レンダリング」がログに記録されます。render を呼び出す前に、fetchLibraries が成功のコールバックを終了することを確認する方法があるかどうか疑問に思っていました。

4

2 に答える 2

1

に渡されるメソッドはwhenpromise を返す必要があります。

var fetchLibraries = function () {
  if (this.screen == "EDIT") {
    return $.ajax({ //return the promise
        url: 'libraries',
        type: "GET",
        crossDomain: $.support.cors,
        xhrFields: {
            withCredentials: $.support.cors
        },
        success: function (data) {
            console.log(data);
            // do some processing with the data that can take some time
        }
    });
  }
};

$.when(this.platforms.fetch(), fetchLibraries()).done(function () {
    self.trigger('removeOverlay');
    self.render();
});
于 2013-09-19T05:56:30.203 に答える