2017-03-09 279 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