【问题标题】:Get query Id in websql mock in ionic 3 (to reuse in other query)在 ionic 3 的 websql mock 中获取查询 ID(以在其他查​​询中重用)
【发布时间】:2018-07-03 06:21:40
【问题描述】:

目前我是 ionic (3) 的新手,我正在尝试构建一个支持数据库的应用程序(这样用户可以在离线时使用该应用程序)。 但是我有一个问题,我无法理解为什么它会这样工作。

我做了什么。 我的设置是 Angular 5 框架上的 ionic3 应用程序。 对于设备上的应用程序,我使用 ionic it self 的 sqlite 插件,但我想模拟该插件,以便可以在浏览器中进行测试。所以这是我的模拟代码。

export class SQLiteMock {
public create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
    let db = (<any> window).openDatabase(config.name, '1.0', 'test database', 2 * 1024 * 1024);

    return new Promise((resolve, reject) => {
        resolve(new SQLiteObject(db));
    });
}}


// ------Init call from component------------------------
init(): Promise<boolean> {
    return new Promise(resolve => {
            this.sqlite.create({
                name: 'test.db',
                location: 'default'
            }).then((db: SQLiteObject) => {
                this.db = db;
            });
        }
    );
}

到目前为止一切顺利。当我运行它时,它可以在设备和网络上运行。即使我创建了表格,一切都正确显示。
问题是当我使用下一个代码在数据库中插入查询时:

executeSql(queryStatement: string, params?: Array<string | number>): Promise<any> {
    params = params ? params : [];
    return new Promise((resolve, reject) => {
        this.db.transaction((tx) => {
            tx.executeSql(queryStatement, params,
                (tx, result) => {
                    console.log(result);   //-->  console: SQLResultSet {rows: SQLResultSetRowList, insertId: 5, rowsAffected: 1}
                    console.log(Object.assign({}, result));   //--> console: {}
                    resolve(result);
                },
                (error) => reject(error));
        });
    });
}

我想要做的是使用第一个查询的insertedId,并在下一个查询中使用它。但是正如你所看到的,当 promise 失效时,结果仍然是空的,所以下一个查询会因为没有 Id 而失败。

有人知道我为什么会遇到这个计时问题吗?
以及如何解决承诺等待解决直到结果出现的问题?

已经非常感谢您的帮助,因为我真的很困惑。

亲切的问候

调用函数的函数

execQuery(query: string, params?: Array<string | number>): Promise<number> {
return new Promise((resolve, reject) => {
    this.db.executeSql(query, params)
        .then((result: any) => {
            resolve(result.insertId);    //--> result = {}
        })
        .catch((e) => reject(e));
});

}

【问题讨论】:

    标签: javascript angular ionic3 web-sql


    【解决方案1】:

    第二个 console.log 指令显示空对象 ({}) 的原因似乎与 Object.assign() 函数有关,而不是与 WebSQL 问题有关。根据documentation of Object.assign() function,仅从源对象复制自己的可枚举属性。

    【讨论】:

    • 感谢您的回答。但如果是这种情况,那么我会在调用它的函数中获得 id ......不是吗? execQuery(query: string, params?: Array&lt;string | number&gt;): Promise&lt;number&gt; { return new Promise((resolve, reject) =&gt; { this.db.executeSql(query, params) .then((result: any) =&gt; { resolve(result.insertId); //--&gt; still null }) .catch((e) =&gt; reject(e)); }); } 而且我也没有 ID.... 这就是问题所在,因为我需要这个 ID 来输入下一个查询..
    • 用这种方式简化你的调用函数怎么样:execQuery(query: string, params?: Array&lt;string | number&gt;): Promise&lt;number&gt; { return this.db.executeSql(query, params) .then((result: any) =&gt; { console.dir(result); return result.insertId; }) .catch((e) =&gt; reject(e)); })
    • 刚刚尝试了你的解决方案来简化我的功能......奇怪但真实,现在它工作......我不知道为什么这与我的不同,但非常感谢你!!!跨度>
    • 我认为这是由于您调用 this.db.executeSql() 的执行上下文“this”所致。
    猜你喜欢
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 2020-06-30
    相关资源
    最近更新 更多