2012-10-05 22 views

Respuesta

36

Ok, así que aquí es lo que hice

Estoy ahorrando el la solicitudes pelota en una variable

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

En mi router, tengo una función que se encarga de cerrar los puntos de vista y de la representación vistas . También se ocupa de desencadenar los activadores necesarios para cada cambio de vista, pero eso no es relevante en esta pregunta.

Antes de hacer nada, esta función de router efectúa los siguientes

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

espero que esto ayude a

+0

Tengo un problema relacionado pero tengo más de una colección. Entonces, antes de abortar una solicitud, necesito estar seguro de que está asociada a una colección específica. Hice esa pregunta aquí, ¿quizás ya has abordado este problema también? http://stackoverflow.com/questions/21919690/association-between-backbone-collection-and-xhr-object-created-when-fetching – wuliwong

+0

No implemento esto todavía, pero una cosa que puede intentar es almacenar todo xhr solicitudes en una matriz. En cada solicitud xhr o en cada cambio de vista, puede recorrer la matriz para borrar las que están completas y detener aquellas que desea detener. Eso debería proporcionar una limpieza adecuada. – Xerri

4

Supongo que está utilizando la red troncal con jQuery. Si es así, la siguiente pregunta parece proporcionar una respuesta para usted:

Abort Ajax requests using jQuery

Backbone fetch devuelve el xhr que están hablando, IIRC.

+0

pero no recuperar el retorno xhr una vez que se haya completado? No estoy seguro de cómo usar el enlace que proporcionó para implementarlo en Backbone – Xerri

+0

Backbone utiliza llamadas ajax normales (a través de Zepto o jQuery), lo que significa que la llamada al servidor es asincrónica y aún puede finalizar. – JayC

-3

Probablemente su respuesta el mismo :)

uso de tiempo de espera para especificar un valor de tiempo de espera. Esto desencadenará la función de error. Aquí la consulta puede ser abortada.

¿Hay alguna razón por la que desee abortar la consulta?

+0

Quisiera abortar porque si cambio la vista antes de que se complete la consulta, se generará un error cuando se complete la búsqueda y se elimine la vista. – Xerri

9

Otra respuesta tardía en caso de que alguien más se encuentre con esto.

Terminé sobrescribiendo Backbone.sync para agregar un grupo de objetos XHR y una opción para abortar solicitudes pendientes en 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

Muy bueno ... podría no ser flexible si realiza múltiples solicitudes de búsqueda en una vista particular. FYI ... Una de las razones por las que necesitaba esto era para evitar que se lanzaran errores cuando se completa una búsqueda, pero la vista ha cambiado (por lo que el elemento DOM que habría contenido los datos ya no está allí). Un simple try/catch alrededor de la búsqueda solucionó esto. – Xerri

Cuestiones relacionadas