0

我创建了一个名为 todo 的数据库,其表名 todo 具有标题、日期等字段。该表现在是空的。

我定义了一个以标题为参数的函数,并检查表是否包含该标题。

它应该返回行数。

获取标题功能:

todo.webdb.GetTitle = function(title) {
    var db = todo.webdb.db;
    db.transaction(function(tx){
      tx.executeSql("SELECT title FROM todo WHERE title=?", [title],
          loadTitle,
          todo.webdb.onError);
      });
  } 

加载标题功能:

function loadTitle(tx, rs) {
    return rs.rows.length;
  }

调用 GetTitle 函数:

row=todo.webdb.GetTitle("Hello");
alert(row);

我得到警报'undefined'它应该返回0

我现在很困惑如何解决这个问题。

4

1 回答 1

2

我认为事务是异步的,所以你需要回调函数来接收值。

todo.webdb.GetTitle = function(title, callback) {
    var db = todo.webdb.db;
    db.transaction(function(tx){
          tx.executeSql("SELECT title FROM todo WHERE title=?", [title],
              (function loadTitle(tx, rs){
                    callback( rs.rows.length );
              }),
              todo.webdb.onError);
      });
} 
todo.webdb.GetTitle( "Hello", function(count){
    alert( "count = " + count );
});

这是一个很好的教程以获取更多信息。

http://blog.darkcrimson.com/2010/05/local-databases/

更新

出于这个主要原因,不要在循环内创建函数。

两者ititle都引用了在本地范围之外创建的值。i因此分配给两者的最后一个值title将显示出来。

for (i = 0; i < itemcount; i++) {
    alert('i outside if:' + i);
    var title = x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;
    
    todo.webdb.GetTitle( title, function (count) {
        if (!count) {
            alert('i inside if:' + i);
            alert( title ); 
        }
    });
}

修复:生成一个将值锁定在闭包中的函数。

var createTitleCallBack = function( i, title ){
    return function (count) {
        if (!count) {
            alert('i inside if:' + i);
            alert( title ); 
        }
    };
};
for (i = 0; i < itemcount; i++) {
    alert('i outside if:' + i);
    var title = x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;
    
    todo.webdb.GetTitle( title, createTitleCallBack( i, title ) );
}   
于 2012-07-31T06:43:49.677 回答