首页 > 解决方案 > TypeScript:从等待的 Promise 中解构数组并在运行时编译并崩溃

问题描述

我试图从react-native-sqlite-storage 库的 executeSql函数中获取 ResultSet ,但我得到了.TypeError: Cannot read property '0' of undefined

executeSql函数应该返回 a Promise<[Transaction, ResultSet]>,我似乎无法正确解构。

我的代码database.ts::

let conn = SQLite.openDatabase({name: DATABASE_NAME, location: 'default'})

export default class Db  {
  static async getConn() {
    return await conn
  }

  static async getTransaction() {
    return new Promise<Transaction>(async (resolve,reject) => {
      const conn = await this.getConn()
      conn.transaction((transaction: Transaction) => {
        resolve(transaction)
      })
    })
  }

  static async executeSql(sqlStatement: string, args?: any[]) {
    return new Promise<ResultSet>(async (resolve,reject) => {
      const transaction = await this.getTransaction()
      const [tr, results] = await transaction.executeSql(sqlStatement, args)  // ??
      resolve(results)
    })
  }
}

编译:

Db.executeSql = function (sqlStatement, args) {
    return __awaiter(this, void 0, void 0, function () {
        var _this = this;
        return __generator(this, function (_a) {
            return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
                    var transaction, _a, tr, results;
                    return __generator(this, function (_b) {
                        switch (_b.label) {
                            case 0: return [4 /*yield*/, this.getTransaction()];
                            case 1:
                                transaction = _b.sent();
                                return [4 /*yield*/, transaction.executeSql(sqlStatement, args)];
                            case 2:
                                _a = _b.sent(), tr = _a[0], results = _a[1];  // <= ERROR HERE: TypeError: Cannot read property '0' of undefined
                                resolve(results);
                                return [2 /*return*/];
                        }
                    });
                }); })];
        });
    });
};

标签: typescript

解决方案


查看代码(https://github.com/andpor/react-native-sqlite-storage/blob/master/lib/sqlite.core.js#L449transaction.executeSql不会返回 Promise。它实际上并没有返回任何东西。

似乎该方法需要一个successerror回调,所以你的代码应该是这样的:

static async executeSql(sqlStatement: string, args?: any[]) {
    const transaction = await this.getTransaction();
    const [tr, results] = await new Promise<ResultSet>(
      (resolve,reject) =>           
        transaction.executeSql(sqlStatement, args,
          (t, r) => resolve([t, r]), 
          (err) => reject(err)
        )
    );
    return results;
}

推荐阅读