繁体   English   中英

TypeScript:从等待的Promise进行数组解构编译并在运行时崩溃

[英]TypeScript: array destructuring from awaited Promise compiles and crash at runtime

我正在尝试 react-native-sqlite-storage的executeSql函数获取ResultSet ,但是我得到TypeError: Cannot read property '0' of undefined

executeSql函数应该返回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*/];
                        }
                    });
                }); })];
        });
    });
};

回顾过去的代码,( https://github.com/andpor/react-native-sqlite-storage/blob/master/lib/sqlite.core.js#L449 ), transaction.executeSql不返回的承诺。 它实际上不返回任何东西。

看来该方法需要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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM