1

我需要运行 SQL SELECT 语句并存储结果。然后我需要将这些结果传递给一个函数并根据给定的数据点创建一个图表。请参阅下面的代码。

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

createGraph(dataKWhr);

console.log("Created graph");

getCoverageAndKWhr函数开始运行,但原始函数的其余部分继续使用 log 语句和createGraph. 这会失败,因为此时 dataKWhr 未定义,因为它的值尚未从getCoverageAndKWhr().

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

这是一个带有 jQ​​ueryMobile 的 PhoneGap 应用程序。目前在安卓上测试。

4

3 回答 3

2

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

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

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

于 2013-10-29T23:13:41.823 回答
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); 
        }
    });
}
于 2013-10-29T23:58:01.600 回答
1

可以肯定的是,任何 I/O 操作都将是异步的。对 SQLite/WebSQL DB 的任何调用都会在其构造过程中包含回调。你需要利用它们。(然后,当您学会讨厌回调设计模式时,您可能希望转换为Promises。)

于 2013-10-29T23:34:04.523 回答