javascript - 编写 promise 以使用传递两个参数的回调

标签 javascript promise web-sql babeljs

在最近的一个 cordova 应用程序中,我们使用了 WebSQL api,因为它为我们提供了本地存储数据所需的设备支持和功能。我们将在即将进行的项目中再次使用它,所以我开始探索 implemented in core.js, using BabelJS 的 promise . 编辑添加了 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 语句。这很简单,可以包含一个 promise 。比较棘手的部分是 executeSql 方法的回调。它传递事务,这很适合用于其他查询。然后它传递结果数据。我怎样才能把它包装在一个 promise 中?

在我的 DataSource 类中,executeSql 方法记录了一个事务对象,但没有记录 res 对象。然后交易正确触发,并且返回 promise 应该有效。但我尊重它只返回第一个参数。我该如何解决这个问题?

最佳答案

在您的executeSql 方法中,您将resolve 传递给transaction.executeSQL 方法。

Promise 就像普通值一样 - 你不能从一个函数返回多个值 - 就像你不能 resolve 具有多个值的 promise 一样。您的选择是要么使用 [transaction, response] 数组(并使用 babeljs 的 ES6 解构赋值)解析它,要么只使用一个参数解析。在您的情况下,很明显您只对响应感兴趣。

function executeSQL(transaction, query, args){
    return new Promise((resolve, reject) =>
        transaction.executeSQL(query, args, (t,r) => resolve(r), reject);
    );
}

请注意,您可以将 DataSource 类重构为:

class DataSource{
    async executeSQL(query, args){
        let connection = getConnection();
        let transaction = await transaction(connection);
        let result = await executeSQL(transaction, query, args);
        return result; // or console.log result.rows.length
    }
}

您不需要在此处传递交易,因为您已经拥有它并且它为您解决的问题(上下文传递)在 promises 中不存在。

关于javascript - 编写 promise 以使用传递两个参数的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28637417/

相关文章:

html - websql插入速度慢

javascript - HTML5 WebSQL 优化/缓存选项?

javascript - 具有部分定义的对象类型 flowjs

javascript - 在 Promise 返回函数中找到第一个成功

javascript - 将 Web SQL 数据库导出到文本文件并使用 javascript 代码将其邮寄给 Phonegap 项目中的用户

javascript - 执行一个 promise 循环并捕获过程中的错误

firebase - Angular2 中的 Promise 与 firebase

javascript - 跨 Controller 共享和观察数据

JavaScript 选择/范围框架

php - 奇怪的字符而不是撇号出现在 url 变量 (GET) 中