异步-等待不愿意解决承诺

时间:2019-09-06 18:25:08

标签: javascript typescript react-native async-await expo

我正在使用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。代码按预期运行。相同的输出记录两次。

任何想法。谢谢!

1 个答案:

答案 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];
  }