typescript - 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*/];
}
});
}); })];
});
});
};
解决方案
查看代码(https://github.com/andpor/react-native-sqlite-storage/blob/master/lib/sqlite.core.js#L449)transaction.executeSql
不会返回 Promise。它实际上并没有返回任何东西。
似乎该方法需要一个success
和error
回调,所以你的代码应该是这样的:
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;
}
推荐阅读
- python - 检查excel表中是否存在pandas DataFrame系列中的值
- magento-2.3 - 所有类别设置为noindex,follow
- c# - 可空引用类型和 ToString() 重载
- amazon-s3 - How to grant public read only access to S3 Bucket in AWS SAM template
- android - Flutter 需要 Android SDK 28 和 Android BuildTools 28.0.3
- c# - 使用 C# 客户端连接到 socket.io,但使用/加入房间
- amazon-web-services - 如何使用 AWS EC2 实例 (Ubuntu AMI) 安装第三方 SSL 证书?它会花费一次性还是每月?
- c++ - 函数调用中的参数太多。C++
- ruby - 使用类和方法标记日志记录
- c++ - 在我的自定义 std::vector 实现中调用了错误的插入函数重载