Thomas
Thomas

Reputation: 311

indexedDB.deleteDatabase() throws error

I am trying to delete a database for unit testing:

var DeleteDb = indexedDB.deleteDatabase(dbName);

this piece of code gets directly called in the first beforeEach in jasmine. with chrome devTools i can see that DeleteDb.error has the following value:

error: [Exception: DOMException: Failed to read the 'error' property from 'IDBRequest': The request has not finished.]

DeleteDb.onsuccess or DeleteDb.onerror are never fired. Also i am never trying to read an 'error' property in the code.

Does somebody know what this error means, where it is coming from or how i can solve it?

UPDATE: This code still sometimes fails for me. it gives me the same error as above.

<html>
    <head>
        <script>
        var deleteDb = window.indexedDB.deleteDatabase('fakeNonExistentDatabase');
        deleteDb.onsuccess = function() {
            console.log('complete');
        };
        </script>
    </head>
</html>

I am still not sure why this is happening. sometimes opening a new tab or closing another one works. Also it never gives an error when removing the onsuccess callback

UPDATE 2 Well it seems that the code is actualy working, but the onsuccess event is never getting fired because no events are getting fired anymore when pressing F8 in chrome devtools. The error i;m getting now is:

Uncaught InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.

I thought the above error message was a result of the first error message in this post but actualy it was the other way around. There are a few pages i can find about this topic on the internet but there isn't really provided a answer.

Any thoughts?

Upvotes: 2

Views: 3719

Answers (4)

Alpha2k
Alpha2k

Reputation: 2241

This is 5 years late, but just in case there are more guys like me...

close the connection to the database before deleting it...

Upvotes: 0

Khen Solomon Lethil
Khen Solomon Lethil

Reputation: 21

Make sure when deleting

  • the RESULT from DB creation is not empty
  • close the RESULT before deleting
  • delete through the same connection you created

var init=function(){
	var request = this.connection.open(name,version);
	request.onupgradeneeded=function(e){
		var version=e.target.result;
	};
	request.onsuccess=function(e){
	   db.result=e.target.result;
	};
	request.onerror=function(e){
	};
};
var remove=function(){
	if (typeof db.result !== 'undefined') {
		db.result.close();
		return this.connection.deleteDatabase(version);
	}
}

Upvotes: 0

Thomas
Thomas

Reputation: 311

Okay as it turns out all of my code was good but deleting a database a second time takes somwhere between 10 seconds and several minutes.

you can test this for yourself: the code in this post shows it

what was happening is that jasmine times out after 5 seconds by default (i changed this to a higher number but who would think i takes THAT long)

browser: Chrome 39.0.2171.71 m

Upvotes: 0

David Fahlander
David Fahlander

Reputation: 5671

Also check onblocked. There might be another db connection that keeps your delete request from neither succeeding nor failing.

It is possible to avoid this behaviour by listening to onversionchange on your opened connections and make sure to close the connection when that event is triggered.

Upvotes: 1

Related Questions