Ist es möglich, Backbone-“Lese”-Anforderungen zu stoppen

Lesezeit: 3 Minuten

Ich habe eine Backbone-Anwendung mit mehreren Ansichten. Das Wechseln zwischen Ansichten löst Ajax-Anforderungen aus, um verschiedene Sammlungen abzurufen. Ich möchte die aktuelle Ajax-Anfrage “Lesen” stoppen, wenn eine neue gestartet wird. Ist es möglich?

Benutzer-Avatar
Xerri

Ok, also hier ist, was ich getan habe

Ich speichere die Abrufanforderungen in einer Variablen

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

In meinem Router habe ich eine Funktion, die sich um das Schließen der Ansichten und das Rendern von Ansichten kümmert. Es kümmert sich auch um das Auslösen aller Trigger, die für jede Ansichtsänderung benötigt werden, aber das ist in dieser Frage nicht relevant.

Bevor Sie irgendetwas tun, führt diese Router-Funktion Folgendes aus

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

ich hoffe das hilft

  • Ich habe ein ähnliches Problem, aber ich habe mehr als eine Sammlung. Bevor ich also eine Anfrage abbreche, muss ich sicher sein, dass sie mit einer bestimmten Sammlung verknüpft ist. Ich habe diese Frage hier gestellt, vielleicht haben Sie dieses Problem auch schon angepackt? stackoverflow.com/questions/21919690/…

    – wuliwong

    20. Februar 2014 um 21:19 Uhr

  • Sie haben dies noch nicht implementiert, aber Sie können versuchen, alle xhr-Anforderungen in einem Array zu speichern. Bei jeder xhr-Anforderung oder bei jeder Ansichtsänderung können Sie das Array durchlaufen, um die vollständigen zu löschen und die zu stoppen, die Sie stoppen möchten. Das sollte für eine angemessene Reinigung sorgen.

    – Xerri

    21. Februar 2014 um 17:25 Uhr

Noch eine späte Antwort, falls jemand anderes darauf stößt.

Am Ende habe ich Backbone.sync überschrieben, um einen XHR-Objektpool und eine Option zum Abbrechen ausstehender Anforderungen beim Abrufen hinzuzufügen.

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

  • Sehr cool …. möglicherweise nicht flexibel, wenn Sie mehrere Abrufanforderungen in einer bestimmten Ansicht ausführen. FYI … Einer der Gründe, warum ich dies brauchte, war, Fehler zu vermeiden, wenn ein Abruf abgeschlossen ist, sich aber die Ansicht geändert hat (das DOM-Element, das die Daten enthalten hätte, ist also nicht mehr vorhanden). Ein einfaches Try/Catch-around-the-Fetch hat dies behoben.

    – Xerri

    5. August 2013 um 10:06 Uhr

Benutzer-Avatar
JayC

Ich nehme an, Sie verwenden Backbone mit jQuery. Wenn ja, scheint die folgende Frage eine Antwort für Sie zu liefern:

Ajax-Anfragen mit jQuery abbrechen

Rückgrat fetch gibt die zurück xhr Sie reden über IIRC.

  • aber würde xhr nicht zurückholen, nachdem es abgeschlossen war? Sie sind sich nicht sicher, wie Sie den von Ihnen bereitgestellten Link verwenden, um ihn in Backbone zu implementieren

    – Xerri

    8. Oktober 2012 um 8:31 Uhr

  • Backbone verwendet normale Ajax-Aufrufe (über Zepto oder jQuery), was bedeutet, dass der Aufruf an den Server asynchron ist und möglicherweise immer noch beendet werden kann.

    – JayC

    8. Oktober 2012 um 14:58 Uhr

1030990cookie-checkIst es möglich, Backbone-“Lese”-Anforderungen zu stoppen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy