Während mein Weg durch die wunderbare Welt der IndexedDB machen, stieß ich auf Code wie this von Mozillas Test-Suite:Erläutern, wie ein Generator in diesem JavaScript-Code mit IndexedDB verwendet wird?
/**
* 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;
}
Die anderen Tests werden in einem ähnlichen Stil geschrieben, in Bezug auf die typischen „Pyramide des Schicksals gegen "Stil, den Sie mit IndexedDB sehen, weil asynchrone Callbacks zusammen gestapelt sind (und natürlich werden Generatoren nicht weit über Firefox hinaus unterstützt ...).
Also, dieser Code von Mozilla ist etwas ansprechend und faszinierend für mich, wie es sehr sauber aussieht, aber ich bin mir nicht ganz sicher, was yield
in diesem Zusammenhang tut. Kann mir jemand helfen, das zu verstehen?
Welche Art von Details kann ich bereitstellen? – buley
Ich bin mir nicht ganz sicher. Ich verstehe immer noch nicht wirklich, was vor sich geht. Als Referenz [hier ist der Begriff grabEventAndContinueHandler definiert] (http://hg.mozilla.org/mozilla-central/file/895e12563245/dom/indexedDB/test/helpers.js). Sagt das irgendwie "wenn du zur" yield "Linie kommst, warte bis das Event beendet ist"? Wie? – dumbmatter
Auch, danke für Ihre ursprüngliche Antwort und Ihre anderen IndexedDB Antworten hier. Du bist einer der wenigen Menschen auf der Welt, die tatsächlich darüber schreiben, wie es benutzt werden sollte. – dumbmatter