2013-10-29 125 views
1

我需要运行SQL SELECT语句并存储结果。然后我需要将这些结果传递给一个函数,并根据给定的数据点创建一个图。见下面的代码。JavaScript在第一次完成前执行第二行代码

var dataKWhr = getCoverageAndKWhr(); 
console.log(dataKWhr); 

createGraph(dataKWhr); 

console.log("Created graph"); 

getCoverageAndKWhr功能开始运行,但原函数的其余部分继续与日志语句和createGraph。这会失败,因为此时dataKWhr未定义,因为它的值尚未从getCoverageAndKWhr()返回。

我宁可不延迟固定的秒数。在继续之前是否有办法等待第一行完成?

这是一个带有jQueryMobile的PhoneGap应用程序。目前正在Android上测试。

+1

你将需要传递一个回调函数getCoverageAndKWhr(),以便按照你想要的方式工作。 –

+0

如果getCoverAndKWhr中有任何异步代码,您将需要一个回调函数,如@ErrolFitzgerald所述。 – Markasoftware

+0

[获取Webkit的executeSql事务返回值]的可能的重复(http://stackoverflow.com/questions/740523/getting-a-webkit-executesql-transaction-to-return-a-value) –

回答

2

如果没有getCoverageAndKWhr函数背后的代码,很难分辨真正发生了什么。

也许某些执行路径没有返回值。

getCoverageAndKWhr也可以异步执行。如果是这种情况,您必须找到一种方法将getCoverageAndKWhr转换为同步调用或传递一个回调函数,一旦getCoverageAndKWhr执行完成,就会调用该函数。

+0

Thx,I需要一个回调函数。 –

1

任何I/O操作都会异步。任何对SQLite/WebSQL DB的调用都会有回调作为其构建的一部分。你需要利用它们。 (然后,当你学习讨厌回调设计模式时,你可能希望转换为Promises。)

1

我发现当你用Javascript编程时,总是认为每个函数都是异步。这就是为什么像这样的东西是一个禁忌:

var dataKWhr = getCoverageAndKWhr(); 
createGraph(dataKWhr); 

你需要使用回调,这是确保它的使用之前,你的变量将填充唯一现实的途径。因此,它应该看起来更像是这样的:

getCoverageAndKWhr(createGraph); 

而且我不知道什么是在getCoverageAnKWhr,但如果你调用Ajax在那里它会是这个样子:

function getCoverageAndKWhr(callBack) { 
    $.ajax({ 
     type: 'GET', 
     //whatever else 
     success: function (data) { 
      callback(data.KWhr); 
     } 
    }); 
} 
相关问题