最近の Cordova アプリでは、データをローカルに保存するために必要なデバイス サポートと機能を提供する WebSQL API を使用しました。今後のプロジェクトで再び使用する予定なので、BabelJS を使用して、core.js に実装された promise の調査を開始しました。約束の実装への追加されたリンクを編集します。
これが私がこれまでに持っているものです:
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 オブジェクトはログに記録しません。その後、トランザクションは正しく開始され、promise が返されます。しかし、最初のパラメーターのみを返すことを尊重します。どうすればこれを回避できますか?