2012-01-22 6 views
0

JSのスコープとバインディングを完全に理解していないことを認めなければなりません。だから私を抱きしめてください。 私は関数q1から結果rを得たいと思います。しかし、私はtx.executeSql呼び出しで無名関数の外に渡すことはできません。 最初のconsole.logは、rに希望の値が含まれていることを示しています。しかしそれを呼び出し関数に渡す方法は? フレームワークはmootoolsです。javascriptのバインドとスコープ

var q1 = function(table, column, where) { 
    sql = "SELECT " + column + " from " + table; 
    r = ""; 
    if (where != undefined) 
     sql += " WHERE " + where; 
    db.transaction(function(tx) { 
     tx.executeSql(sql, [], function(tx, results) { 
      r = results.rows.item(0)[column] ; 
      console.log(r + " 1 "); //1 
      }, errorHandler); 
    }); 
    console.log(r + " 2 "); //2 
    return r; 
} 

window.addEvent('domready', function() { 
    db.transaction(function (tx) { 
     tx.executeSql('DROP TABLE IF EXISTS nutzer'); 
     tx.executeSql("CREATE TABLE IF NOT EXISTS nutzer (" 
      + " id integer not null primary key, " 
      + " name text not null default '(unbekannt)', " 
      + " jahre integer not null default 0, " 
      + " gewicht integer not null default 0)" 
     ); 
     var params = [1,'der Name',10,30]; 
     tx.executeSql("INSERT OR IGNORE INTO nutzer (id,name,jahre,gewicht) values (?,?,?,?)", params); 
    }); 
    console.log(q1('nutzer', 'name') + " 3 "); //3 
}) 

コンソール出力は次のようになります。どのように非同期作品

2 
3 
der Name 1 
+0

** async **の素晴らしい世界へようこそ!コールバックを使用する必要があります。 – SLaks

+0

返品できません。関数に結果を渡すコールバックを受け入れるようにする必要があります。 –

答えて

0

ないことを。注文に注意してください。2, 3, 1

var q1 = function(table, column, where, callback) { 
    //         ^callbacks 
    sql = "SELECT " + column + " from " + table; 
    r = ""; 
    if (where != undefined) 
     sql += " WHERE " + where; 
    db.transaction(function(tx) { 
     tx.executeSql(sql, [], function(tx, results) { 
      r = results.rows.item(0)[column] ; 
      console.log(r + " 2 "); //2 
      callback(r); 
      // pass r back 
      }, errorHandler); 
    }); 
    console.log(r + " 1 "); //1 
    return r; 
} 

q1('nutzer', 'name', function (r) { 
    console.log(r + " 3 "); // results! 
}); 
+0

これは、データベースから値を読み取り、それを返す同期関数を持つことができないということですか? –

+0

@AlexMonthyもちろんあなたはできません。非同期へようこそ。 – Raynos