javascript - Po await se nic nevykonává
Narazil jsem na zeď ve svém chápání JS promises a event handlerů.
Mám asynchronní funkci přiřazenou ke zpětnému volání onload objektu FileReader. Kód prvního asynchronního volání se provede v pořádku (a pokud vyvolá výjimku, je tato výjimka zachycena). Ale kód po prvním await se nikdy nevykoná.
Proč se kód po await nikdy nespustí?
Očekávám, že buď kód po await se nakonec provede, nebo že dojde k vyvolání výjimky, která bude zachycena catch.
Snažím se pochopit důvod, proč se pokračování nikdy nezavolá.
Rád bych také pochopil, jaký je nejlepší způsob, jak mohu volat asynchronní funkce z funkcí, které nemohou být asynchronní. Chápu, že může být nemožné synchronně počkat na dokončení, ale rád bych alespoň spustil asynchronní provedení všech částí kódu.
const reader = new FileReader();
reader.onabort = () => console.log("file reading was aborted");
reader.onerror = () => console.log("file reading has failed");
reader.onload = async () => {
try {
console.log("Before");
const digestToComponentTextDb = localForage.createInstance({
name: "components",
storeName: "some_store",
});
console.log("Middle");
await digestToComponentTextDb.setItem("key", 'x'.repeat(20000));
console.log('After');
} catch(err) {
console.error(err);
}
};
reader.readAsArrayBuffer(file);
"Před" a "Střed" jsou vytištěny, ale "Po" ne.
Aktualizace:
Vypadá to, že jedna IndexedDB databáze se v Chromu poškodila. Nemohu ji zobrazit. "some_db" se zobrazí správně, ale "components" se nezobrazí (ani se nevybere). Takže problém je zřejmě v tom, jak localForage setItem zpracovává zápisy do poškozených IndexedDB databází.
