Javascript在第一次完成之前执行第二行代码

时间:2013-10-29 22:48:40

标签: javascript sqlite

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

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

createGraph(dataKWhr);

console.log("Created graph");

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

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

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

3 个答案:

答案 0 :(得分:2)

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

也许某些执行路径不会返回值。

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

答案 1 :(得分:1)

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

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