从异步函数

问题描述:

获取数据我有这样的代码:从异步函数

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工作异步,但我使用回调来返回数据。有人可以解释为什么它不工作,以及如何解决这个问题?

标准的方式做,这是包括您自己的回调,像这样:

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

那么,有没有办法,把该数组放在一个变量以外的异步函数? – nukl

+0

@nukl:您可以将值分配给任何更高范围的变量(例如全局变量),但这对您没有帮助。当使用回调时,重要的一点是*数据被访问时*。如果您在执行回调(并设置该值)之前访问变量*,则会出现错误或无数据。在回调之外,有一些非常有效的用例来分配对其他变量的响应,但是您必须了解进行异步调用的含义。 –

+0

@nukl,除非你想使用CoffeeScript(一种JavaScript编译语言):http://jashkenas.github.com/coffee-script/ –

你不返回任何异步操作的结果,而不是你听吧。

在你的代码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; 
});