繁体   English   中英

Typescript异步函数包装Promise

[英]Typescript async function wrapping promise

我目前正在玩Typescriptionic并且对javascript进行async-await也很新。 我试图很好地理解Promise,但是我不知道如何包装调用多个Promise的方法以返回Promise。 我会尽力详细说明:

基本上,我有一个可以创建SQLite数据库的对象,并且当调用create()方法时,一旦create()了该对象,它将返回带有实际数据库对象的Promise

然后 ,当promise解析并返回DB对象时,我需要使用它来执行事务中的某些语句以创建所有表,并在我调用事务中所有语句的执行时返回新的promise。

然后,当事务完成并且一切顺利时,我需要将数据库对象分配给一个类属性,并设置一个标志,指示数据库已创建并准备就绪。

因此,我认为将这种数据库初始化内容包装在一个名为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}`)
        );
    }

如此遥远的研究

您使用了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您需要确保返回最初的承诺。

return this.sqlite.create({...

然后再往下走,您可以返回db对象:

       this.isActive = true;
       return db;

另外,您还应避免嵌套.then()处理程序:当您获得另一个诺言时,只需从第一个处理程序中返回它,然后将另一个.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}`));

看来您没有兑现诺言。

必须解决或拒绝一个Promise,以便异步函数能够响应一个值。

从TypeScript深入研究:

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
});

因此,我认为您应该创建一个承诺,并且在创建数据库并且一切都可以解决它时,如果数据库创建存在问题,请拒绝它。

记住,您可以链接承诺,因此可以在创建数据库时链接它们。

从TypeScript深入研究:

承诺的可链接性是承诺提供的好处的核心。 从那时起,一旦有了承诺,就可以使用then函数创建承诺链。

检查此URL以获取有关诺言的更多信息

希望能帮助到你! :)

暂无
暂无

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

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