gpt4 book ai didi

javascript - Typescript 异步函数包装 Promise

转载 作者:行者123 更新时间:2023-11-28 14:50:11 25 4
gpt4 key购买 nike

我目前正在玩Typescriptionic也是新的async-await在 JavaScript 上。我试图很好地理解 promise ,但我不知道如何包装调用多个 promise 以返回 promise 的方法。我会尽力详细说明:

基本上,我有一个可以创建 SQLite 的对象数据库,当 create()调用方法时,它将返回 Promise创建后与实际的数据库对象一起使用。

然后,当promise解析并返回DB对象时,我需要使用它在事务中执行一些语句来创建所有表,并且当我调用时返回一个新的promise事务中所有语句的执行。

然后当事务完成且一切顺利时,我需要将数据库对象分配给类属性并设置一个标志,指示数据库已创建并准备就绪。

所以我认为将数据库初始化内容包装在一个名为 createDatabase() 的方法中是个好主意。或类似的东西,它返回 Promise<SQLiteObject> ,其中SQLiteObject代表数据库。该方法将在初始化时调用,并应返回 SQLiteObject一旦一切正常,代表数据库,或者抛出一个错误,我将登录到 .catch() Promise的方法.

我对 Promise 以及如何使用有了基本的了解 then()catch()方法,但当我必须创建数据库,然后在 promise 解决时做其他事情,当一切完成后,返回 Promise 时,我有点困惑包含 DB 对象,它是类 SQLiteObject 的实例.

<小时/>

代码
以下是我当前的Typescript代码。它不是有效的 typescript ,因为我不知道如何返回 Promise<SQLiteObject>来自async功能。

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,您需要确保返回最初的 promise 。

return this.sqlite.create({...

然后再进一步,您可以返回 db 对象:

       this.isActive = true;
return db;

此外,您应该避免嵌套 .then() 处理程序:当您收到另一个 Promise 时,只需从第一个处理程序返回它,并在末尾链接另一个 .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}`));

关于javascript - Typescript 异步函数包装 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44801270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com