在最近工作的一个 cordova 应用程序中,我们使用了 WebSQL api,因为它为我们提供了在本地存储数据所需的设备支持和功能。我们将在即将到来的项目中再次使用它,所以我开始探索在 core.js 中实现的 Promise,使用 BabelJS。编辑添加到承诺实施的链接。
这是我到目前为止所拥有的:
function getConnection () {
return window.openDatabase("cfa.db", "1.0", "CFA Database", 1000000);
}
function executeSql (transaction, query, args) {
return new Promise((resolve, reject) => {
console.log(query);
transaction.executeSql(query, args, resolve, reject);
});
}
function transaction (connection) {
return new Promise((resolve, reject) => {
connection.transaction(resolve, reject);
});
}
class DataSource {
executeSql (query, args) {
var connection = getConnection();
transaction(connection).then((tx) => {
return executeSql(tx, query, args);
}).then((tx, res) => {
console.log(tx, res.rows.length);
}, (tx, e) => {
console.log(e);
});
}
}
这是使用 api 本身进行简单查询的准系统:
var connection = getConnection();
connection.transaction(function (tx, res) {
tx.executeSql("SELECT * FROM table", [], function (tx, res) {
console.log(res.rows.length);
}, function (tx, err) {
console.log(err);
});
}, function (err) {
console.log(err);
});
所以事务只是传递事务实例,我可以用它来执行 sql 语句。这很简单,可以包含在一个承诺中。更棘手的部分是executeSql
方法的回调。它传递事务,这很适合用于其他查询。然后它传递结果数据。我怎样才能把它包装在一个承诺中?
在我的DataSource
类中,executeSql 方法记录了一个事务对象,但没有 res 对象。然后事务正确触发,返回承诺应该可以工作。但我尊重它只返回第一个参数。我怎样才能解决这个问题?