[英]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.