从异步函数获取数据

时间:2011-08-25 21:21:10

标签: javascript asynchronous web-sql

我有这段代码:

    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 个答案:

答案 0 :(得分:6)

执行此操作的标准方法是包含您自己的回调,如下所示:

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

答案 1 :(得分: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;
});