1

最近の 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 が返されます。しかし、最初のパラメーターのみを返すことを尊重します。どうすればこれを回避できますか?

4

2 に答える 2

1

あなたの意図は両方の値を約束の結果の一部として提供することであるため、それらをオブジェクトにラップして、それを受け取った人が抽出できるようにすることを提案します。

function executeSql (transaction, query, args) {
    return new Promise((resolve, reject) => {
        console.log(query);
        transaction.executeSql(query, args, (t, r) => resolve({ 
            transaction: t, 
            result: r
        }), reject);
    });
}

使用法:

transaction(connection)
.then(tx => executeSql(tx, query, args))
.then({result} => console.log(tx, result.rows.length), 
      e => console.log(e)
);
于 2015-02-20T21:17:05.683 に答える