Привязка и область действия в JavaScript - PullRequest
0 голосов
/ 22 января 2012

Я должен признать, что я еще не полностью понимаю область действия и привязку в JS. Так что терпите меня. Я хотел бы получить результат r из функции q1. Но я не могу передать его за пределы анонимной функции в вызове tx.executeSql. Первый console.log показывает, что r содержит желаемое значение. Но как передать это вызывающей функции? Каркас - это мультяшки.

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 

1 Ответ

0 голосов
/ 22 января 2012

Это не так, как работает асинхронный.Обратите внимание на заказ, 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!
}); 
...