Si bien haciendo mi camino a través del maravilloso mundo de IndexedDB, me encontré con un código como this del conjunto de pruebas de Mozilla:¿Explica cómo se usa un generador en este código JavaScript con IndexedDB?
/**
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
var testGenerator = testSteps();
function testSteps()
{
const IDBObjectStore = Components.interfaces.nsIIDBObjectStore;
const name = this.window ? window.location.pathname : "Splendid Test";
const description = "My Test Database";
var data = [
{ name: "inline key; key generator",
autoIncrement: true,
storedObject: {name: "Lincoln"},
keyName: "id",
keyValue: undefined,
},
{ name: "inline key; no key generator",
autoIncrement: false,
storedObject: {id: 1, name: "Lincoln"},
keyName: "id",
keyValue: undefined,
},
{ name: "out of line key; key generator",
autoIncrement: true,
storedObject: {name: "Lincoln"},
keyName: undefined,
keyValue: undefined,
},
{ name: "out of line key; no key generator",
autoIncrement: false,
storedObject: {name: "Lincoln"},
keyName: null,
keyValue: 1,
}
];
for (let i = 0; i < data.length; i++) {
let test = data[i];
let request = mozIndexedDB.open(name, i+1, description);
request.onerror = errorHandler;
request.onupgradeneeded = grabEventAndContinueHandler;
let event = yield;
let db = event.target.result;
let objectStore = db.createObjectStore(test.name,
{ keyPath: test.keyName,
autoIncrement: test.autoIncrement });
request = objectStore.add(test.storedObject, test.keyValue);
request.onerror = errorHandler;
request.onsuccess = grabEventAndContinueHandler;
event = yield;
let id = event.target.result;
request = objectStore.get(id);
request.onerror = errorHandler;
request.onsuccess = grabEventAndContinueHandler;
event = yield;
// Sanity check!
is(test.storedObject.name, event.target.result.name,
"The correct object was stored.");
request = objectStore.delete(id);
request.onerror = errorHandler;
request.onsuccess = grabEventAndContinueHandler;
event = yield;
// Make sure it was removed.
request = objectStore.get(id);
request.onerror = errorHandler;
request.onsuccess = grabEventAndContinueHandler;
event = yield;
ok(event.target.result === undefined, "Object was deleted");
db.close();
}
finishTest();
yield;
}
Sus otras pruebas están escritos en un estilo similar, a diferencia de la típica pirámide" de la condenación "Estilo que se ve con IndexedDB debido a que las devoluciones de llamada asincrónicas se apilan juntas (y, por supuesto, los generadores no son ampliamente compatibles más allá de Firefox ...).
Por lo tanto, este código de Mozilla es algo atractivo y intrigante para mí, ya que se ve muy limpio, pero no estoy totalmente seguro de lo que yield
está haciendo en este contexto. ¿Alguien puede ayudarme a entender esto?
¿qué tipo de detalle puedo ofrecer? – buley
No estoy del todo seguro. Todavía no entiendo realmente lo que está pasando. Como referencia, [aquí es donde se define grabEventAndContinueHandler] (http://hg.mozilla.org/mozilla-central/file/895e12563245/dom/indexedDB/test/helpers.js). ¿De alguna manera está diciendo "cuando llegues a la línea' yield', esperas hasta que el evento haya terminado? ¿Cómo? – dumbmatter
Además, gracias por su respuesta original y sus otras respuestas IndexedDB aquí. Según parece, eres una de las pocas personas en el mundo que realmente escribe sobre cómo debería usarse. – dumbmatter