【问题标题】:Code execution step by step (synchronous)代码一步一步执行(同步)
【发布时间】:2014-07-01 12:03:54
【问题描述】:

我的index.html 中只有两行(见下文)代码。我想在执行第二行之前执行第一行。我该怎么做/确保这一点?目前,dataDB 的控制台中将出现“未定义”,因为函数 getDataFunction() 需要一些时间。

var dataDB = getDataFunction(afterDate, toDate, afterTime, toTime);
console.log("Content of dataDB: " + dataDB);

对您来说可能是一个简单的问题 :-) 感谢您的帮助!

更新:getDataFunction() 这个函数只是用d3(数据驱动文档)从服务器获取一些数据(collection+json)...参数用于识别感兴趣的数据(时间范围)。

function getDataFunction(afterDate, toDate, afterTime, toTime){

    d3.json("http://server...", function(error, data){
        if(error) {
            console.log(error);
        } else {
            console.log(data);

            dataDB = data.collection.items;
            console.log(dataDB);
        }
    });
}

【问题讨论】:

  • 可能和你getDataFunction的内容有关。你需要提供更多关于你在那里做什么的信息。可能是一个设置为异步的ajax调用。它会解释这种行为。
  • 正如您在上面看到的,我已经用有关 getDataFunction() 的附加信息更新了原始问题。

标签: function call execution synchronous


【解决方案1】:

D3 api reference

它在 api 参考中说帖子确实是异步完成的,因此其余代码的执行继续进行(在本例中为 console.log),没有合适的方法让 javascript 等待。最好的办法是重新设计它,让您的回调函数处理接下来需要发生的任何事情。

【讨论】:

  • 好的,我明白了。如果我在函数的 else 语句中执行 console.log("Content of dataDB: " + dataDB);,它就可以工作。我应该如何在回调函数中重新设计它?你有想法吗?谢谢!
  • 问题是 d3.json 调用是异步执行的。因此调用执行,当 awnser 重新运行时,您创建的回调函数(if/else)将被执行。由于异步性质,它将在后台开始执行此操作,其余代码在 json 调用仍在执行时执行(因此未定义日志消息)。所以无论你接下来想做什么,它都必须在回调函数中启动,因为没有像样的方法让 javascript 等待它。您可以做的是在您的回调中放置一个函数调用,以便在需要等待时启动下一个。
猜你喜欢
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多