簡體   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