aaronpowell / db.js

db.js is a wrapper for IndexedDB to make it easier to work against
http://aaronpowell.github.com/db.js/
MIT License
818 stars 142 forks source link

Global 'server' variable becomes undefined? #191

Open radiolondra opened 1 year ago

radiolondra commented 1 year ago

I'm using a function to open the database and try to use the assigned server variable in other functions:

var server;

function OpenDB() {
  db.open({
      .....
  }).then(function(s) {
    server = s;
  });
}

function DoSomethingInDB() {
  console.log("Server var:", server); <<<< undefined
  server.mytable.count().then(function(ct) {  <<<error: Cannot read properties of undefined (reading 'mytable')
    ...
  });
}

....

OpenDB();
DoSomethingInDB();

My database is successfully created in OpenDB(). Unfortunately, it seems that the global server var becomes undefined outside the OpenDB function. From documentation:

A connection is intended to be persisted, and you can perform multiple operations while it's kept open

But I didn't close it. Bah? For sure I'm doing something wrong. Can you help me? Thanks.

SpicyCatGames commented 1 year ago

Hey, I do not think this is an issue. Your then() is likely executing after DoSomethingInDB() so server is not even assigned to yet. To avoid this, in an async function, you need to await db.open().

Try this for example:

var server;

async function OpenDB() {
    await db.open("somedb").then(function (s) {
        server = s;
    });
}

function DoSomethingInDB() {
    console.log("Server var:", server);
    server.mytable.count().then(function (ct) {

    });
}

async function Exec(){
    await OpenDB();
    DoSomethingInDB();
}

Exec();

Anyway, this is how promises work and there is nothing wrong with the library itself in the example you provided.