我知道标题是满口的,但老实说我不能为我的具体案例提出一个更好的标题(对建议持开放态度)。
所以基本上我记下了this JSFiddle(简化版)我面临的问题。我正在使用AngularJS的$q.all
方法来收集依赖于查询结果的promises数组:
db.transaction(function(tx) {
$q.all(fn(tx)).then(function(a) {
console.log("Result:", a);
});
});
其中fn
是一个返回promises数组的函数
在上面的例子中,一切都按预期工作,结果(解析承诺的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
是一个只返回一个解析为tx
对象本身的promise的函数
我偶然发现了常见的陷阱吗?我搜索了一下,但没有想出任何东西。欢呼声。
答案 0 :(得分:2)
这是因为当### Error querying database. Cause: java.lang.NullPointerException
### The error may exist in com/MyRequestMapper.java (best guess)
### The error may involve com.MyRequestMapper.getAllRequests
### The error occurred while handling results
### SQL: SELECT* FROM MY_REQUESTS where request_date = ?
### Cause: java.lang.NullPointerException
解决后,交易已经关闭。
如果您不在fn2
和fn2
中使用交易(甚至是同一交易),它应该有效:
fn
请参阅此fiddle。