0

タイトル、日付などのフィールドを持つテーブル名 todo を持つ todo というデータベースを作成しました。テーブルは現在空です。

タイトルをパラメーターとして受け取り、テーブルにそのタイトルが含まれているかどうかを確認する関数を定義しました。

行数を返す必要があります。

GetTitle 関数:

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

loadTitle 機能:

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/

アップデート

この主な理由から、関数をループ内に作成しないでください。

iとの両方titleが、ローカル スコープ外で作成された値を参照しています。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 に答える