2012-10-05 1 views
20

私はビューの数を持つ基幹アプリケーションを持っている「を読んで」バックボーンを停止することが可能です。ビューを切り替えると、異なるコレクションを取得するAjaxリクエストがトリガーされます。新しい "ajax"リクエストが開始された場合、現在の "read" ajaxリクエストを停止したいと思います。出来ますか?はリクエスト

答えて

36

[OK]をので、ここで私が

私は私のルータでは、変数

app.fetchXhr = this.model.fetch(); 

にフェッチ要求を保存していますがやったことですが、私は景色を眺めを閉じるとレンダリングの世話をする機能を持っています。また、各ビューの変更に必要なトリガーをトリガーしますが、この質問には関係ありません。

何かを行う前に、このルータ機能は、以下の

//Stop pending fetch 
if(app.fetchXhr.readyState > 0 && app.fetchXhr.readyState < 4){ 
    app.fetchXhr.abort(); 
} 

を実行し、私はこれがおそらく返事が遅れ:)タイムアウト値を指定する

使用タイムアウト

+0

関連する問題がありますが、複数のコレクションがあります。だから私がリクエストを中止する前に、それが特定のコレクションに関連付けられていることを確認する必要があります。私はここでその質問をしました。おそらくあなたは既にこの問題に取り組んでいますか? http://stackoverflow.com/questions/21919690/association-between-backbone-collection-and-xhr-object-created-when-fetching – wuliwong

+0

まだこれを実装するためにしませんでしたが、あなたが試すことができます一つのことは、すべてのXHRを格納することです配列内のリクエスト各xhr要求または各ビューの変更時に、配列をループして完全なものを消去し、停止したいものを停止することができます。それは適切なクリーンアップを提供するはずです。 – Xerri

4

私はjQueryを使ってバックボーンを使用していると仮定します。彼らはIIRC、話しているxhrを返しfetch

Abort Ajax requests using jQuery

バックボーン:その場合は、次の質問は、あなたのための答えを提供しているようです。

+0

完了したらxhrをフェッチしませんか?バックボーンで実装するために提供したリンクの使用方法がわかりません – Xerri

+0

バックボーンは通常のajax呼び出し(ZeptoまたはjQuery経由)を使用します。つまり、サーバーへの呼び出しは非同期であり、終了する可能性があります。 – JayC

-3

に役立ちます願っています。これにより、エラー機能が起動されます。ここで、クエリを中止できます。

クエリを中止する理由何らかの理由はありますか?

+0

クエリが完了する前にビューを変更すると、フェッチが完了してビューが削除されるとエラーが生成されるため、中止したいと考えています。 – Xerri

9

しかし、他のケースの誰かで別の返事が遅れは、このに実行されます。

私はXHRオブジェクトプールとフェッチの保留中の要求を中止するオプションを追加するBackbone.syncを上書きしてしまいました。

var sync = Backbone.sync 
    , xhrPool = []; 

Backbone.sync = function(method, model, options) { 
    options = options || {}; 
    if (method === 'read') { 
    if (options.abortPending == true) {  
     for (var i = 0; i < xhrPool.length; i++) { 
     if (xhrPool[i]['readyState'] > 0 && xhrPool[i]['readyState'] < 4) { 
      xhrPool[i].abort(); 
      xhrPool.splice(i, 1); 
     } 
     } 
    } 

    // cleanup xhrPool 
    // todo: make removal from the pool an 'always' jqXHR callback 
    // instead of cleanup on every read? 
    for (var i = 0; i < xhrPool.length; i++) { 
     if (xhrPool[i]['readyState'] === 4) { 
     xhrPool.splice(i, 1); 
     } 
    } 

    var xhr = sync(method, model, options); 
    xhrPool.push(xhr); 
    return xhr; 
    } else { 
    return sync(method, model, options); 
    } 
}; 
+0

特定のビューで複数のフェッチ要求を行うと、非常に涼しい....柔軟性がないかもしれません。 FYI ...私が必要とした理由の1つは、フェッチが完了したがビューが変更されたためにエラーが発生しないようにすることでした(データを含むDOM要素はもはや存在しません)。フェッチの周りのシンプルなtry/catchがこれを修正しました。 – Xerri