IndexedDb — База создаётся через раз, почему?

Добрый день!
Есть некоторое приложение для Chrom браузеров. В нём есть кнопка обновить, после нажатия которой проиходит следующее:
1) При помощи функции "deleteBase" - удалются две базы indexedDb.
2) Если функция "deleteBase" вернула ответ "1" запускаем ajax запрос к файлу на сервере
3) Получаем ответ от сервера с содержимым "catalog.json" (размер 5мб - 15000 строк)
4) Создаём базу данных indexedDb при помощи "createBaseData" с набором "catalog.json"
5) Далее если база создана (если resultcreateData имеет результат "1") тогда создаём по аналогии базу менеджеров из набора данных "manager.json"(размер данных 2Kb)
6) Последний ajax запрос - получает от php скрипта с сервера дату создания файла "catalog.json" .
Вопрос в том что, база данных полученная из ответа от файла "catalog.json" создаётся через раз. Точнее, либо она создаётся, но без индексов, либо создаётся с индексами, но индексы абсолютно пустые(т.е нет данных) и третий вариант созадётся корректно и приложение работает как задумано. Не понимаю почему база от "catalog.json" создаётся не постоянно, при этом база от "manager.json" создаётся всегда как положенно(при каждом нажатие кнопки "Обновить"). Все сетевые запросы проходит отлично, ответы от сервера содержут необходимый набор данных. Пробовал менять размер файла "catalog.json" до 85 Kb - это ничего не меняет.
Наведите на мысль или подскажите вектор развития и понимания проблемы.

var resultDelet = deleteBase('B2suz2', 'B2Manager');

                if (resultDelet == 1) {//Если удаление баз вернуло 1 - удачно
                    $.ajax({
                        type: "POST",
                        url: "http://domain.xx/files/web/catalog.json",
                        dataType: "json",
                        error: function () {
                            console.log("В запросе произошла ошибка catalog");
                            $('.restartDanger .message').text('Не удалось выполнить обновление - повторите попытку позже');
                            $('.restartDanger').fadeIn(300);
                        },
                        success: function (fileobj) {
                            console.log("Запрос выполнен catalog");
                            var result = fileobj;

                            var resultcreateData = createBaseData('B2suz2', 'catalog', 'cod', result, '1');
                            console.log("Результат СОЗДАНИЯ БАЗЫ " + resultcreateData);
                            //Качаем менеджеров
                            if (resultcreateData == 1) {
                                $.ajax({
                                    type: "POST",
                                    url: "http://domain.xx/files/web/manager.json",
                                    dataType: "json",
                                    error: function () {
                                        console.log("В запросе произошла ошибка manager");
                                    },
                                    success: function (fileobj) {
                                        console.log("Запрос выполнен manager");
                                        var result = fileobj;

                                        createBaseManager('B2Manager', 'manager', 'email', result, '1');
                                        $('.restartDanger .message').text('Для применения обновлений, перезапустите приложение!');
                                        $('.restartDanger').fadeIn(300);


                                        $.ajax({
                                            type: 'POST',
                                            url: 'http://domain.xx/files/web/webOrderClient.php',
                                            dataType: 'json',

                                            data: {
                                                update: 'update'
                                            },
                                             success: function (data) {
                                                console.log("Последнее обновление прайса " + data);
                                                chrome.storage.local.set({"catalogupdate": data}, function () { //Сохраняем данные о дате обновления прайса
                                                    console.log("Данные об обновлении сохранил");


                                                });

                                            },
                                            error: function () {
                                                console.log("Информация о прайсе не получена, ошибка доступа на сервер");


                                            }
                                        });

                                    }


                                });
                            }
                            ////////////////////////////


                        },
                        beforeSend: function () {
                            $('.statusupdatepricebar').show();
                        },
                        complete: function () {
                            $('.statusupdatepricebar').hide();
                        }


                    });
                    ////////////////////////////////////

                    //}, 3000);
                    //chrome.runtime.restart();
                }
            } else {
                $('.restartDanger .message').text('Не удалось выполнить обновление - повторите попытку позже');
                $('.restartDanger').fadeIn(300);
            }//online

function createBaseData(dbName, namenabor, keypatch, customerData, versionbase) {
    var result = 0;

    var request = indexedDB.open(dbName, versionbase);

    request.onerror = function (event) {
        console.log("Ошибка открытия базы данных " + dbName);
    };

    request.onupgradeneeded = function (event) {
        var db = event.target.result;

        var objectStore = db.createObjectStore(namenabor, {keyPath: "id", autoIncrement: true});
//Индексы сортировки
        objectStore.createIndex("cod", "cod", {unique: true});
        objectStore.createIndex("pricevip", "pricevip", {unique: false});
        objectStore.createIndex("priceopt", "priceopt", {unique: false});
        objectStore.createIndex("pricekopt", "pricekopt", {unique: false});
        objectStore.createIndex("name", "name", {unique: false});
      
        for (var i in customerData) {
            objectStore.add(customerData[i]);
        }
    };
    var result = request.oncomplete = function (event) {
        return 1;
    }()
    return result;
}

function createBaseManager(dbName, namenabor, keypatch, customerData, versionbase) {

    var result = 0;
    var request = indexedDB.open(dbName, versionbase);

    request.onerror = function (event) {
        console.log("Ошибка открытия базы данных " + dbName);
    };
    request.onupgradeneeded = function (event) {
        var db = event.target.result;

        var objectStore = db.createObjectStore(namenabor, {keyPath: "id", autoIncrement: true});
//Индексы сортировки
        objectStore.createIndex("name", "name", {unique: false});
        objectStore.createIndex("email", "email", {unique: true});
     
        for (var i in customerData) {
            objectStore.add(customerData[i]);
        }
    };
    result = request.oncomplete = function () {
        return 1;
    }()
    return result;
}

function deleteBase(namebase1, namebase2) {
    var result1 = 0;
    var request = indexedDB.deleteDatabase(namebase1);
    request.onerror = function (event) {
        console.log("Ошибка удаления базы " + namebase1);
    }
    result1 = request.onsuccess = function (event) {
        console.log("База данных удалена " + namebase1);
        var request2 = indexedDB.deleteDatabase(namebase2);
        request2.onerror = function (event) {
            console.log("Ошибка удаления базы " + namebase2);
        }

        result2 = request2.onsuccess = function (event) {
            console.log("База данных удалена " + namebase2);
            return  1;

        }();
        return result2;


    }()
    return result1;

}
  • Вопрос задан
  • 289 просмотров
Решения вопроса 1
AMar4enko
@AMar4enko
Потому что асинхронное выполнение, а у вас какой-то ад.
result2 = request2.onsuccess = function (event) {
            console.log("База данных удалена " + namebase2);
            return  1;

        }();

Что, по-вашему, делает этот код? Откройте для себя promise и, в частности, bluebird.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы