IndexedDB, как обеспечить добавление IDBOpenDBRequest.onupgradeneeded до наступления события - PullRequest
0 голосов
/ 27 ноября 2018

В нескольких документах IndexedDB приведена следующая последовательность действий для инициализации БД и создания одного ObjectStore.

1) request = window.indexedDB.open(...)
2) request.onsuccess = ...;
3) request.onupgradeneeded = ...

Однако я обнаружил, что если шаг (3) будет выполнен через некоторое время, он не будет выполнен.

Вот тестовый код:

var db;
var request = window.indexedDB.open("birds-db", 1);
const startTime = new Date().getTime();
const simulatedDelay = 300;

function deltaTime() {
    return new Date().getTime() - startTime;
}

request.onerror = function(event) {
    console.log('error: ' + event);
};

request.onsuccess = function(event) {
    console.log('onsuccess was called T' + deltaTime());
    db = event.target.result;
};

setTimeout(function() {
    console.log('after waiting  ' + simulatedDelay + " miliseconds T" + deltaTime());
    request.onupgradeneeded = function(event) {
        console.log('onupgradeneeded was called T' + deltaTime());
        var db = event.target.result;
        var objectStore = db.createObjectStore("birds", {
            keyPath: "sci_name"
        });
    };
}, simulatedDelay);

console.log("end " + deltaTime());

В приведенном выше примере, если для simulatedDelay установлено значение 300 миллисекунд, в большинстве случаев все идет хорошо, показывая что-то вроде:

end 1
after waiting  300 miliseconds T302
onupgradeneeded was called T474 
onsuccess was called T479

Но установка его на 2000 или более приведет к:

end 0
onsuccess was called T602
after waiting  2000 miliseconds T2001

И "onupgradeneeded" вообще не вызывается.Мой браузер Firefox 60.

Конечно, если я установил «onupgradeneeded» сразу после «open», проблема не возникнет.

Как я могу быть уверен в более сложных ситуациях, что onupgradeeeded всегда устанавливается до того, как произойдет событие?

1 Ответ

0 голосов
/ 27 ноября 2018

Если вы не устанавливаете синхронно обработчики событий, это условие гонки.Если обработчик события установлен до того, как событие сработает, функция обратного вызова.В противном случае, нет.

На практике вы всегда должны устанавливать эти обработчики событий синхронно, потому что условия гонки очень запутанные.

...