[英]Typescript async function wrapping promise
我目前正在玩Typescript
和ionic
並且對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.