javascript Typescript异步函数 Package promise

y1aodyip  于 2023-06-28  发布在  Java
关注(0)|答案(2)|浏览(129)

我正在使用Typescriptionic,也是JavaScript上的async-await的新手。我试图对promise有一个很好的理解,但是我不知道如何 Package 调用多个promise的方法来返回一个promise。我会更好地解释:
基本上,我有一个可以创建SQLite数据库的对象,当调用create()方法时,它将返回一个Promise,其中包含创建后的实际数据库对象。

然后,当promise解析并返回DB对象时,我需要用它来执行一个事务中的一些语句来创建所有的表,当我调用事务中所有语句的执行时,返回一个新的promise。
然后当事务完成并且一切正常时,我需要将数据库对象分配给一个类属性,并设置一个标志,指示数据库已创建并准备就绪。

因此,我认为将这些数据库初始化内容 Package 在一个名为createDatabase()或类似的方法中是一个好主意,该方法返回Promise<SQLiteObject>,其中SQLiteObject表示数据库。这个方法将在初始化时被调用,并且应该在一切正常时返回表示数据库的SQLiteObject,或者抛出一个错误,我将在Promise.catch()方法中记录该错误。
我对promise以及如何使用then()catch()方法有一个基本的了解,但是当我必须创建数据库,然后在promise解析时做一些其他事情,并且当一切都完成时,返回一个包含DB对象的Promise时,我有点困惑,这是类SQLiteObject的示例。

代码

下面是我目前的Typescript代码。这不是有效的类型脚本,因为我不知道如何从async函数返回Promise<SQLiteObject>

async createDatabase(): Promise<SQLiteObject> {

        this.sqlite.create({
            name: this.dbName,
            location: this.dbLocation
        }).then( (db: SQLiteObject) => {
            // Insert all tables.
            let createTableParam: string = `CREATE TABLE IF NOT EXISTS param (name PRIMARY KEY NOT NULL, value TEXT)`;
            let createTableNews: string = `CREATE TABLE IF NOT EXISTS news (id PRIMARY KEY NOT NULL,title TEXT,
                content TEXT, image TEXT, date DATE)`;

            db.transaction(tx => {
                    tx.executeSql(createTableParam);
                    tx.executeSql(createTableNews);
                    // Add here more tables to create if needed
                }
            )
                .then( () => {
                    console.log('Tables were created');
                    this.isActive = true;
                })
                .catch(error => {
                    console.log(`Error creating tables - ${error}`);
                });
        }).catch(
            error => console.log(`Error at SQLite initialization - ${error}`)
        );
    }

迄今为止的研究

oogrdqng

oogrdqng1#

您使用了async,这意味着您可以在任何时候使用Promise在函数中使用await,并编写代码,就像它是同步的一样。

async createDatabase(): Promise<SQLiteObject> {
    let db: SQLiteObject;
    try {
      db = await this.sqlite.create({
        name: this.dbName,
        location: this.dbLocation
      });
    } catch(error) {
        console.log(`Error at SQLite initialization - ${error}`);
        return;
    );
    // Insert all tables.
    let createTableParam: string = `CREATE TABLE IF NOT EXISTS param (name PRIMARY KEY NOT NULL, value TEXT)`;
    let createTableNews: string = `CREATE TABLE IF NOT EXISTS news (id PRIMARY KEY NOT NULL,title TEXT,
        content TEXT, image TEXT, date DATE)`;

     try {
       await db.transaction(tx => {
                tx.executeSql(createTableParam);
                tx.executeSql(createTableNews);
                // Add here more tables to create if needed
            }
          );

       console.log('Tables were created');
       this.isActive = true;
       return db;
     catch(error) {
         console.log(`Error creating tables - ${error}`);
     });
}

如果没有await,则需要确保返回初始promise。

return this.sqlite.create({...

然后再向下返回db对象:

this.isActive = true;
       return db;

另外,你应该避免嵌套.then()处理程序:当你得到另一个promise时,只需从第一个处理程序返回它,并在末尾链接另一个.then

createDatabase(): Promise<SQLiteObject> {
    let database: SQLiteObject = null;
    return this.sqlite.create({
        name: this.dbName,
        location: this.dbLocation
    })
    .catch(error => console.log(`Error at SQLite initialization - ${error}`))
    .then( (db: SQLiteObject) => {
        // Insert all tables.
        let createTableParam: string = `CREATE TABLE IF NOT EXISTS param (name PRIMARY KEY NOT NULL, value TEXT)`;
        let createTableNews: string = `CREATE TABLE IF NOT EXISTS news (id PRIMARY KEY NOT NULL,title TEXT,
            content TEXT, image TEXT, date DATE)`;
        database = db;
        return db.transaction(tx => {
                tx.executeSql(createTableParam);
                tx.executeSql(createTableNews);
                // Add here more tables to create if needed
            }
        );
    })
    .then( () => {
        console.log('Tables were created');
        this.isActive = true;
        return database;
    })
    .catch(error => console.log(`Error creating tables - ${error}`));
wb1gzix0

wb1gzix02#

看来你并没有解决这个问题。
一个promise必须被解析或拒绝,这样async函数才能用一个值来响应。
TypeScript Deep Dive:

const promise = new Promise((resolve, reject) => {
    resolve(123);
});
promise.then((res) => {
    console.log('I get called:', res === 123); // I get called: true
});
promise.catch((err) => {
    // This is never called
});

所以在我看来,你应该创建一个promise,当数据库被创建并解决了它,如果数据库创建有问题,就拒绝它。
记住,你可以链接promise,所以你可以在创建数据库时链接它们。
TypeScript Deep Dive:
Promise的链能力是Promise提供的好处的核心。一旦你有了一个promise,从那时起,你就可以使用then函数来创建一个promise链。
查看URL以获取更多关于promise的信息。

相关问题