【发布时间】:2017-12-01 17:54:45
【问题描述】:
我目前正在使用 Typescript 和 ionic 以及 async-await 的 JavaScript 新手。我试图很好地理解承诺,但我不知道如何包装调用多个承诺以返回承诺的方法。我会尽量详细说明:
基本上,我有一个可以创建SQLite 数据库的对象,当调用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}`)
);
}
研究至今
- 我读过this question here,这似乎是相关的,但我是 对如何在我的代码上实现感到困惑
- 在 MDN 上检查了 async/await
- This question here 似乎也相关,但仍然不明白如何去做。
- Typescript promises 在“Typescript Deep Dive”
- Async/Await 在“Typescript Deep Dive”
【问题讨论】:
标签: javascript typescript asynchronous ionic-framework async-await