2017-03-09 174 views
0

我对d3.js中的应用程序逻辑有疑问。我发送一个ajax请求(一些json数据)从客户端到服务器和服务器(nodejs)我保存到一个文件。然后我尝试通过以下命令获取json数据。d3.json()函数返回undefined

 d3.json("nodes.json", function(error, json) { 
     if(error) 
     { 
      console.warn('nodes.json error', error); 
      //throw error; 
     } 
     console.log("d3.json"); 
     savedNodesLinks = json; 
    }); 
    console.log('parsed', JSON.parse(JSON.stringify(savedNodesLinks || null))); 
    if(JSON.parse(JSON.stringify(savedNodesLinks || null)) != null) 
    { 
     links = JSON.parse(JSON.stringify(savedNodesLinks || null)).links; 
     nodes = JSON.parse(JSON.stringify(savedNodesLinks || null)).nodes; 
    } 

此函数它由上述代码段由一个按钮调用。当我第一次点击按钮时,'savedNodesLinks'变量显示为未定义的。当我第二次按下按钮时,数据以一种可靠的方式出现。我该如何解决这个问题?我调试的代码,但我无法找到问题提前

感谢,

+0

d3.json()调用是异步的,这意味着它不会立即得到json。当json可用时,调用具有'console.log(“d3.json”)'的函数。在那一点上它是可用的。同时调用d3.json()之后的调用console.log()调用(在json可用之前),因此savedNodesLinks尚未定义。我建议阅读JavaScript中的异步调用以更好地理解这一点。 – rasmeister

回答

1

savedNodeLinks使用范围以外的尝试saveNodesLinks = json使用后,你的代码inmediatelly。

因为之前实际服务器返回nodes.json文件

d3.json("nodes.json", function(error, json) { 
    if(error) 
    { 
     console.warn('nodes.json error', error); 
     //throw error; 
    } 
    console.log("d3.json"); 
    savedNodesLinks = json; 
    console.log('parsed', JSON.parse(JSON.stringify(savedNodesLinks || null))); 
    if(JSON.parse(JSON.stringify(savedNodesLinks || null)) != null) 
    { 
     links = JSON.parse(JSON.stringify(savedNodesLinks || null)).links; 
     nodes = JSON.parse(JSON.stringify(savedNodesLinks || null)).nodes; 
    } 
}); 

这不是d3.js console.log('parsed', ...会发生,它是关于JavaScript的异步编程。 检查Introduction to asynchronous JavaScript

+0

你是什么意思在saveNodesLinks = json之后立即尝试使用你的代码? – zoint