链接promise时出现WebSQL错误“SQL执行被禁止”

WebSQL error `SQL execution is disallowed` when chaining promises

本文关键字:执行 SQL 禁止 错误 promise WebSQL 链接      更新时间:2023-09-26

我知道这个标题很难理解,但老实说,我无法为我的具体案例想出更好的标题(可以接受建议(。因此,基本上我在这个JSFiddle(的简化版本(上记下了我面临的问题。我使用AngularJS的$q.all方法来收集依赖于查询结果的承诺数组:

db.transaction(function(tx) {
    $q.all(fn(tx)).then(function(a) {
        console.log("Result:", a);
    });
});

其中CCD_ 2是返回promise数组的函数
在上面的例子中,一切都按预期进行,结果(解析promise的sql查询结果数组(是正确的console.log ged
然而,如果我将$q.all封装在另一个延迟对象的then方法中,如下所示:

db.transaction(function(tx) {
    fn2(tx).then(function(tx) {
        $q.all(fn(tx)).then(function(a) {
            console.log("Result:", a);
        });
    });
});

我得到错误:Error: Failed to execute 'executeSql' on 'SQLTransaction': SQL execution is disallowed.
(fn2是一个仅返回promise的函数,该promise解析为tx对象本身(
我是否偶然发现了一个常见的陷阱?我到处找,但什么也没找到。干杯

这是因为在解析fn2时事务已经关闭。

如果您在fn2fn中都不使用事务(甚至不使用相同的事务(,那么它应该可以工作:

db.transaction(function(tx) {
    fn2(tx).then(function(tx) {
        // new tranaction as the old one is closed
        db.transaction(function(tx) {
            $q.all(fn(tx)).then(function(a) {
                console.log("Result:", a);
            });
        });
    });
}); 

看看这把小提琴。