使用HTML5数据库的“未捕获的TypeError:非法调用”

时间:2012-03-09 14:59:07

标签: javascript database html5 google-chrome

在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)');
});

您知道如何让第一个解决方案有效吗?我希望尽可能简单,也要在同一笔交易中。

1 个答案:

答案 0 :(得分:1)

Chrome中的几个主机对象就是这种情况。 .bind应该适用于这些情况:

callback(tx.executeSql.bind(tx));

重点是tx的引用丢失(内部使用的this值)。您正在传递SQLTransaction原型的“通用”函数,而没有在tx上调用它的信息。但是,.bind会正确绑定this值,即使您不像obj.func()那样调用它,而是将其称为“裸”函数调用。