gpt4 book ai didi

angularjs - Cordova SQLite 等到插入完成

转载 作者:行者123 更新时间:2023-12-03 18:45:18 25 4
gpt4 key购买 nike

在开始 SELECT 请求之前,我想完成多个 INSERT。我的问题是 SELECT 触发时 INSERT 尚未完成。

为数据库处理制作了一个工厂:
数据库工厂.js

factory.insertIntoTable= function (database, data) {
var sqlCommand = 'INSERT INTO blablabla';

database.transaction(function(tx) {
database.executeSql(sqlCommand, [data.thingsToInsert], function (resultSet) {
console.log('success: insertIntoTable');
}, function (error) {
console.log('SELECT error: ' + error.message);
});
}, function(error) {
console.log('transaction error: ' + error.message);
database.close();
}, function() {
console.log('transaction ok: insertIntoTable');
});
};

应用程序.js
ionic.Platform.ready(function () {
if (window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
cordova.plugins.Keyboard.disableScroll(true);
};

if(window.StatusBar) {
StatusBar.styleDefault();
}

db = window.sqlitePlugin.openDatabase({name: 'myDbName.db', location: 'default'});

if (window.Connection) {
if (navigator.connection.type !== Connection.NONE) {
databaseFactory.createTables(db);

MyService.getStuffFromAPI().then(function(result) {
for (var index = 0; index < result[0].campaigns.length; index++) {
databaseFactory.insertIntoTable(db, result[0].campaigns[index]);
}

var selectResult = databaseFactory.selectFromCampaigns();

console.log(selectResult); //This log comes earlier than the above inserts could finish.

}, function(result) {
console.log(result);
});
}
}
});

无论如何,INSERT 工作正常,我确实检查过。

我知道 datebase.transaction 是异步的,所以也尝试使用单个 db.executeSQL 命令,但即使添加 $q 解析,拒绝工厂也有同样的问题。我真的需要一些帮助,谢谢!

最佳答案

每个 Insert 都会返回一个 Promise。将这些 promise 保存在一系列 promise 中,并使用 $q.all 等待它们全部完成。

示例:用于插入对象的工厂方法

function insert(object){

var deferred = $q.defer(); //IMPORTANT

var query = "INSERT INTO objectTable (attr1, attr2) VALUES (?,?)";
$cordovaSQLite.execute(db, query, [object.attr1, object.attr2]).then(function(res) { //db object is the result of the openDB method
console.log("INSERT ID -> " + res.insertId);
deferred.resolve(res); //"return" res in the success method
}, function (err) {
console.error(JSON.stringify(err));
deferred.reject(err); //"return" the error in the error method
});

return deferred.promise; //the function returns the promise to wait for
}

然后,在每个插入中:
promises.push(yourService.insert(obj).then(function(result){ //"result" --> deferred.resolve(res);
//success code
}, function(error){ //"error" --> deferred.reject(err);
//error code
}));

最后:
$q.all(promises).then(function(){//do your selects}, function(err){//error!});

希望能帮助到你。

关于 $q 和 $q.all 的更多信息: https://docs.angularjs.org/api/ng/service/$q#all

另一个例子: https://www.jonathanfielding.com/combining-promises-angular/

关于angularjs - Cordova SQLite 等到插入完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38455103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com