2011-03-02 16 views
6

Tengo un almacén de datos IndexedDB con algunos cientos de objetos en él. Me gustaría obtener los elementos 40-59 de él según el orden en uno de mis índices en esa tienda. ¿Hay alguna manera de hacerlo sin simplemente llamar cursor.continue() 39 veces antes de comenzar a consumir datos? Parece bastante desperdicio en términos de tiempo de procesamiento.Búsqueda con cursor IndexedDB

Respuesta

6

que tenían el mismo problema y cursor.advance(40) es lo que desea utilizar.

Una cosa que me tomó un tiempo entender que puede ser útil para otros es si quieres avanzar con el cursor y repetir los resultados, necesitarás llamarlos en manejadores separados de openCursor().onsuccess, o implementar algún tipo de seguimiento para evitar que ambos sean llamados en la misma solicitud o que se genere una excepción InvalidStateError. Esto se puede hacer de esta manera:

manejadores diferentes

// advance first 
store.openCursor().onsuccess = function(event) { 
    var cursor = event.target.result; 
    cursor.advance(40); 
}; 

// then iterate 
objectStore.openCursor().onsuccess = function(event) { 
    var cursor = event.target.result; 
    cursor.continue(); 
}); 

mismo controlador de referencia

// create flag for advancing 
var advancing = true; 

store.openCursor().onsuccess = function(event) { 

    var cursor = event.target.result; 

    // advancing 
    if (advancing === true) { 

     cursor.advance(40); 

     // set advancing flag to false so we don't advance again 
     advancing = false; 

    } 
    // continuing 
    else { 

     cursor.continue(); 

    } 

} 

Spec: http://www.w3.org/TR/IndexedDB/#widl-IDBCursor-advance-void-unsigned-long-count Referencia MDN con el ejemplo: https://developer.mozilla.org/en-US/docs/Web/API/IDBCursor.advance

Cuestiones relacionadas