在Chrome中试用以下代码时出现错误:
var db = openDatabase('foo', 1, 'foo', 1111);
var sql = function(callback){
db.transaction(function(tx){
callback(tx.executeSql);
});
};
sql(function(query){
// Dose 1 or more querys in same transaction
query('CREATE TABLE IF NOT EXISTS DEMO1 (id unique, data)');
query('CREATE TABLE IF NOT EXISTS DEMO2 (id unique, data)');
});
Sasy:未捕获TypeError:非法调用
我真的不知道这意味着什么。
但是这段代码很好用:
var db = openDatabase('foo', 1, 'foo', 1111);
var sql = function(callback){
db.transaction(function(tx){
callback(tx);
});
};
sql(function(query){
// Dose 1 or more querys in same transaction
query.executeSql('CREATE TABLE IF NOT EXISTS DEMO1 (id unique, data)');
query.executeSql('CREATE TABLE IF NOT EXISTS DEMO2 (id unique, data)');
});
您知道如何让第一个解决方案有效吗?我希望尽可能简单,也要在同一笔交易中。
答案 0 :(得分:1)
Chrome中的几个主机对象就是这种情况。 .bind
应该适用于这些情况:
callback(tx.executeSql.bind(tx));
重点是tx
的引用丢失(内部使用的this
值)。您正在传递SQLTransaction
原型的“通用”函数,而没有在tx
上调用它的信息。但是,.bind
会正确绑定this
值,即使您不像obj.func()
那样调用它,而是将其称为“裸”函数调用。