我正在使用expo-sql库: 文档在这里:https://docs.expo.io/versions/latest/sdk/sqlite/
示例:https://snack.expo.io/@git/github.com/expo/sqlite-example
import { SQLite } from 'expo-sqlite';
import { WebSQLDatabase, ResultSet } from 'expo-sqlite/build/SQLite';
const db = SQLite.openDatabase('dbName', version);
interface WebSQLDatabase {
transaction(callback: (tx: Transaction) => void,
error?: (error: {[key: string]: any}) => void,
success?: () => void
);
}
interface Transaction {
executeSql(sqlStatement: string, args?: any[],
success?: (transaction: Transaction, resSet: ResultSet) => void,
error?: (transaction: Transaction, error: {[key: string]: any}) => void
);
}
因此,我正在使用react-native库和expo-sqlite库,并尝试使用回调将某些函数转换为返回Promise的函数,如下所示:
export type SqlArg = number | string;
export interface SqlQuery {
sql: string;
args?: SqlArg[];
}
export function transactionAsync(queries: SqlQuery[]): Promise<ResultSet[]> {
return new Promise( (resolve, reject) => {
let results: ResultSet[] = [];
db.transaction((tx) => {
for (let i=0; i<queries.length; i++) {
const query = queries[i];
tx.executeSql(query.sql, query.args, (_, resSet) => {
results.push(resSet);
}, err => reject(err));
}
}, err => reject(err), () => {
console.log('transaction results', results);
resolve(results);
});
});
}
export class DatabaseService {
// working code
// public static createTables(): Promise<ResultSet> {
// return new Promise( (resolve, reject) => {
// transactionAsync([
// {
// sql: `create table if not exists items(
// id integer primary key,
// task_name text not null,
// datetime integer not null,
// mood integer not null,
// comment text)`
// }
// ]).then( (res) => {
// resolve(res[0]);
// });
// });
//}
public static async createTables(): Promise<ResultSet> {
return await transactionAsync([
{
sql: `create table if not exists items(
id integer primary key,
task_name text not null,
datetime integer not null,
mood integer not null,
comment text)`
}
])[0];
}
}
现在,以下代码段首先返回 undefined ,然后记录具有正确输出的transaction results...
。
(async () => {
console.log(await DatabaseService.createTables());
})();
如果我写,输出是相同的:
DatabaseService.createTables()
.then(res => console.log(res));
如果以非异步方式写入DatabaseService.createTables
。代码按预期运行。相同的输出记录两次。
任何想法。谢谢!
答案 0 :(得分:0)
这里的问题是我正在等待返回的promise的第一个元素,而不是等待的函数的第一个元素-应该是这样的:
public static async createTables(): Promise<ResultSet> {
return (await transactionAsync([
{
sql: `create table if not exists items(
id integer primary key,
task_name text not null,
datetime integer not null,
mood integer not null,
comment text)`
}
]))[0];
}