Hirdetés

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

  • Jim-Y
    veterán

    Sziasztok! Adott az alábbi metódus. Mire kéne fűznöm az onerror-t, hogy meg tudjam hívni benne a deferred object-en a reject()-et? Próbáltam már mindenre, de ha direkt rossz adatbázis nevet vagy tábla nevet adok meg, akkor nem fut bele az onerror-omba :(

    dataSourceIndexedDb = function(databaseProp, tableProp){

    this.getData = function(){
    var open = indexedDB.open(database, 1);
    var data;
    var defer = $.Deferred();
    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;
    defer.resolve(data);
    };

    tx.onerror = function(error){
    defer.reject(error);
    };

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

    return defer;
    };

    var database = databaseProp;
    var table = tableProp;
    dataSource.call(this);
    };

    En ezt valahogy igy oldanam meg. Kicsit objektumorientaltabb.

    class DataSourceIndexedDB extends EventEmitter {

    get MESSAGES() {
    return {
    CONNECTION_ERROR: 'error',
    DATABASE_OPENED: 'db-opened'
    }
    }

    constructor(databaseName) {
    this._dbName = databaseName;
    this._database = null;
    }

    openDatabase() {
    const request = indexedDB.open(this._dbName, 1);
    request.onerror = this.onConnectionError.bind(this);
    request.onsuccess = this.onConnectionSuccess.bind(this);
    }

    onConnectionError(event) {
    this.emit(this.MESSAGES.CONNECTION_ERROR, {
    code: event.target.errorCode
    });
    }

    onConnectionSuccess(event) {
    this._database = event.target.result;
    this.emit(this.MESSAGES.DATABASE_OPENED);
    }

    getObjectStore(storeName, mode) {
    const tx = this._database.transaction(storeName, mode);
    return tx.objectStore(storeName);
    }
    }

    const database = 'xyz';
    const table = 'xyz';
    const indexedDB = new DataSourceIndexedDB(database);

    // might be automated in constructor
    indexedDB.openDatabase();

    indexedDB.on(indexedDB.MESSAGES.DATABASE_OPENED, () => {
    const store = indexedDB.getObjectStore(table, 'readwrite');
    const request = store.getAll();

    request.onsuccess = (event) => {
    const data = event.target.result;
    // do smtg with data
    };

    request.onerror = (event) => {
    // error handling
    }
    });

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