Hirdetés

Új hozzászólás Aktív témák

  • Karma
    félisten

    Sziasztok! IndexedDb a téma, hogyan adhatom vissza a getData() metódussal a táblában található elemeket?

    Az async működést nem igazán vágom :(

    this.getData = function(){
    var open = indexedDB.open(database, 1);
    var data;
    open.onsuccess = function() {
    // Start a new transaction
    var db = open.result;
    var tx = db.transaction(table, "readwrite");
    var store = tx.objectStore(table);

    // Query the data
    var getAllData = store.getAll();

    getAllData.onsuccess = function() {
    data = getAllData.result;
    };

    // Close the db when the transaction is done
    tx.oncomplete = function() {
    db.close();
    };
    };
    return data;
    };

    Az aszinkron működést nem tudod megkerülni, úgyhogy olyan getData függvényt, amit egyszerűen szinkron módon meghívsz és eredményeket ad vissza, lehetetlen írni. (Nem is feltétlen baj.)

    Van egy pár lehetőséged, az egyik legegyszerűbb, ha adsz egy callback paramétert a getData függvényednek. Ez például egy olyan kétparaméteres függvény, aminek az első paramétere a futáskor történt hiba (lehet `null` is ha minden szép), a második pedig a tényleges adat.

    A lényeg, hogy az indexedDB-s kódod az utolsó onsuccess handler végén meghívja ezt a függvényt, így tudod feldolgozni az eredményt.

    Például:

    this.getData = function(callback){
    var open = indexedDB.open(database, 1);

    open.onsuccess = function() {
    // Start a new transaction
    var db = open.result;
    var tx = db.transaction(table, "readonly");
    var request = tx.objectStore(table).getAll();

    request.onsuccess = function() {
    callback(null, request.result);
    };

    request.onerror = function() {
    callback(request.errorCode);
    };

    // Close the db when the transaction is done
    tx.oncomplete = function() {
    db.close();
    };
    };

    open.onerror = function() {
    callback(open.errorCode);
    }
    };

    Máshol meg így hívod:

    valami.getData(function(err, data) {
    if (err) {
    console.log("Error while reading data", err);
    return;
    }

    console.log("Found data", data);
    });

    Ha meg tisztább kódot akarsz, keress egy promise wrappert az IndexedDB-hez szerintem. Persze azt is meg kell tanulni használni először.

    Amúgy sose használtam az IndexedDB-t, de a megérzésem azt mondja, hogy nem kéne minden lekérdezésnél nyitni-zárni.

Új hozzászólás Aktív témák