получение данных из асинхронной функции - PullRequest
5 голосов
/ 26 августа 2011

У меня есть этот код:

    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 работает асинхронно, но я использую обратный вызов для возврата данных.Может кто-нибудь объяснить, почему это не работает и как это исправить?

Ответы [ 2 ]

6 голосов
/ 26 августа 2011

Стандартный способ сделать это - включить ваш собственный обратный вызов, например:

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 */
});
0 голосов
/ 26 августа 2011

Вы не возвращаете результат какого-либо асинхронного действия, вместо этого вы слушаете его.

В вашем коде 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;
});
...