我正在使用Typescript
和ionic
,也是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}`)
);
}
迄今为止的研究
- 我读过this question here,它似乎相关,但我对如何在我的代码中实现感到困惑
- 已在MDN上检查async/await
- This question here看起来也是相关的,但仍然不知道如何做到这一点。
- Typescript promises在“Typescript Deep Dive”
- Async/Await在“Typescript Deep Dive”
2条答案
按热度按时间oogrdqng1#
您使用了
async
,这意味着您可以在任何时候使用Promise
在函数中使用await
,并编写代码,就像它是同步的一样。如果没有
await
,则需要确保返回初始promise。然后再向下返回
db
对象:另外,你应该避免嵌套
.then()
处理程序:当你得到另一个promise时,只需从第一个处理程序返回它,并在末尾链接另一个.then
:wb1gzix02#
看来你并没有解决这个问题。
一个promise必须被解析或拒绝,这样async函数才能用一个值来响应。
TypeScript Deep Dive:
所以在我看来,你应该创建一个promise,当数据库被创建并解决了它,如果数据库创建有问题,就拒绝它。
记住,你可以链接promise,所以你可以在创建数据库时链接它们。
TypeScript Deep Dive:
Promise的链能力是Promise提供的好处的核心。一旦你有了一个promise,从那时起,你就可以使用then函数来创建一个promise链。
查看URL以获取更多关于promise的信息。