2012-10-05 12 views

risposta

36

Ok ecco quello che ho fatto

sto salvando il la le richieste di recupero in una variabile

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

Nel mio router, ho una funzione che si prende cura di chiudere i punti di vista e rendere viste . Si occupa anche dell'attivazione di eventuali trigger necessari per ogni cambio di visualizzazione ma ciò non è rilevante in questa domanda.

Prima di fare qualsiasi cosa, questa funzione router esegue il seguente

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

Spero che questo aiuta

+0

Ho un problema correlato ma ho più di una collezione. Quindi, prima di interrompere una richiesta, devo essere sicuro che sia associata a una raccolta specifica. Ho fatto questa domanda qui, forse hai già affrontato questo problema? http://stackoverflow.com/questions/21919690/association-between-backbone-collection-and-xhr-object-created-when-fetching – wuliwong

+0

Non ha ancora implementato questo, ma una cosa che puoi provare è memorizzare tutto xhr richieste in un array. Su ciascuna richiesta xhr o su ogni modifica di vista è possibile scorrere l'array per cancellare quelli completi e per interrompere quelli che si desidera interrompere. Questo dovrebbe fornire una pulizia adeguata. – Xerri

4

Presumo che tu stia utilizzando il backbone con jQuery. Se è così, la seguente domanda sembra fornire una risposta per voi:

Abort Ajax requests using jQuery

Backbone fetch restituisce il xhr stanno parlando, IIRC.

+0

ma non recuperare il ritorno xhr dopo che è stato completato? Non sei sicuro di come utilizzare il link che hai fornito per implementarlo in Backbone – Xerri

+0

Backbone utilizza normali chiamate ajax (tramite Zepto o jQuery), il che significa che la chiamata al server è asincrona e può ancora essere potenzialmente terminata. – JayC

-3

Probabilmente una risposta in ritardo :)

Usa timeout per specificare un valore di timeout. Questo attiverà la funzione di errore. Qui la query può essere interrotta.

C'è qualche motivo per cui vuoi interrompere la query?

+0

Vorrei interromperlo perché se cambio la vista prima che la query sia completa, un errore verrebbe generato quando il recupero è completo e la vista verrebbe rimossa. – Xerri

9

Un'altra risposta tardiva nel caso in cui qualcun altro si imbattesse in questo.

Ho finito per sovrascrivere Backbone.sync per aggiungere un pool di oggetti XHR e un'opzione per interrompere le richieste in sospeso su fetch.

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

Molto interessante .... potrebbe non essere flessibile se si eseguono più richieste di recupero in una vista particolare. Cordiali saluti ... Una delle ragioni per cui avevo bisogno di questo era evitare di generare errori quando un recupero è completo ma la vista è cambiata (quindi l'elemento DOM che avrebbe contenuto i dati non è più lì). Una semplice prova/cattura intorno al recupero risolto questo. – Xerri

Problemi correlati