6

私はこのコードを持っています:

    function getData(){
        db.transaction(function(tx){
            tx.executeSql('SELECT * from q', [], function(tx, result){
                var q = [];
                for (var i=0; i < result.rows.length; i++) {
                    q.push(result.rows.item(i));
                };
                console.log(q.length);  // 3
                returnData(q);
            });
        });
    }

    function returnData(data){
        console.log(data.length); // 3
        return data;
    }

   var q = getData(); // undefined

期待どおりに動作しません (何も返されません)。db.transaction非同期で動作するため、発生したと仮定しますが、データを返すためにコールバックを使用しています。なぜ機能しないのか、それを修正する方法を誰かが説明できますか?

4

2 に答える 2

7

これを行う標準的な方法は、次のように独自のコールバックを含めることです。

function getData(callback){
    db.transaction(function(tx){
        tx.executeSql('SELECT * from q', [], function(tx, result){
            var q = [];
            for (var i=0; i < result.rows.length; i++) {
                q.push(result.rows.item(i));
            };
            console.log(q.length);  // 3
            callback(returnData(q));
        });
    });
}

function returnData(data){
    console.log(data.length); // 3
    return data;
}

getData(function(q) {
    /* do something with q */
});
于 2011-08-25T21:24:55.663 に答える
0

非同期アクションの結果を返すのではなく、それをリッスンします。

あなたのコードreturnDataではデータを返しますが、あなたは結果に対して何もしません、それは捨てられます。代わりに、独自のコールバックを使用する必要があります。

function getData(callback){
    db.transaction(function(tx){
        tx.executeSql('SELECT * from q', [], function(tx, result){
            var q = [];
            for (var i=0; i < result.rows.length; i++) {
                q.push(result.rows.item(i));
            };
            console.log(q.length);  // 3
            callback(q);
        });
    });
}

var q;
getData(function(data) {
    console.log(data.length); // 3
    console.log(data);
    doStuffWith(data);
    q = data;
});
于 2011-08-25T21:26:32.437 に答える