链接承诺时,WebSQL 错误“SQL 不允许执行”

WebSQL error `SQL execution is disallowed` when chaining promises

我知道标题很啰嗦,但老实说,我想不出一个更好的标题来针对我的具体情况(欢迎提出建议)。 所以基本上我记下了我面临的问题 this JSFiddle(简化版)。我正在使用 AngularJS 的 $q.all 方法根据查询结果收集一组承诺:

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

其中 fn 是一个 returns 承诺数组的函数。
在上述情况下,一切都按预期工作,结果(解决承诺的 sql 查询结果数组)被正确 console.logged。
但是,如果我将 $q.all 包装在另一个延迟 object 的 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 是一个仅 returns 解析为 tx object 本身的承诺的函数。
我是否偶然发现了一个常见的陷阱?我搜索了但没有想出任何东西。干杯。

那是因为在 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);
            });
        });
    });
}); 

看到这个fiddle