2015-11-05 30 views
0

我想加載一個外部json文件到d3.js,但每次我嘗試將加載的數據分配給一個變量(所以後來我可以使用它與數據( );)它給了我在console.log未定義。我覺得我嘗試了一切,但我不能將數據分配給一個變量,不知道這裏有什麼問題。d3.js不能分配加載的json數據到一個變量

var dataset 

function checkIt(data){ 
for (var i in data) { 
      var data_clean; 
      data_clean = data[i].Total 
      dataset = data_clean 

     } 

     } 
console.log(dataset) 

d3.json("data.json", checkIt); 

數據集

[ 
    { 
    "Continent":"Europe", 
    "Country_Names":"Albania", 
    "Total":3.8 
    }, 
    { 
    "Continent":"Europe", 
    "Country_Names":"Armenia", 
    "Total":5.4 
    }, 
    { 
    "Continent":"Europe", 
    "Country_Names":"Austria", 
    "Total":64.7 
    }, 
    { 
    "Continent":"Europe", 
    "Country_Names":"Azerbaijan", 
    "Total":29.3 
    }] 

回答

1

d3.json是異步的(這意味着checkIt將在未來事件幀觸發。不是在當前事件幀)。您必須在checkIt功能中執行console.log(dataset),而不是在其外部。在checkIt被調用之前,你現在稱之爲的地方。

+0

但是當我在svg.selectAll(「path」).data(dataset)中使用數據集時,它給了我錯誤無法讀取未定義的屬性「長度」,我猜它與數據集不被讀取有關? – Imo

+0

在線查找異步JavaScript。僅僅因爲您稍後在代碼中使用svg.selectAll(「path」).data(dataset)並不意味着它會在d3.json從服務器返回數據之後發生。嘗試把你所有的渲染邏輯放在checkIt中。如果你的服務器工作正常,d3.json能夠在光盤上找到這個文件,那麼一切都應該順利進行。只需在checkIt函數中運行console.log(data),就可以測試是否從服務器獲取數據。 – sergeyz

+0

試試這個。的console.log( '1'); setTimeout(function(){console.log('3');},0);的console.log( '2');這將說明你的代碼中發生了什麼。 – sergeyz

0

更高效的以後保存數據的方法是使用localstorage。在實踐中,可以這樣使用:

function save() { 
    savefile['userList'] = userList 
    savefile['Users'] = Users 
    savefile['qwerty'] = qwerty 
    saved = LZString.compressToBase64(JSON.stringify(savefile)) 
    localStorage.setItem('puppy',saved); 
    update(); 
}; 
function load() { 
    savefile = JSON.parse(LZString.decompressFromBase64(localStorage.getItem('puppy'))) 
    Users = savefile.Users 
    userList = savefile.userList 
    qwerty = savefile.qwerty; 
    title(); 
    update(); 
}; 
function autosave() { 
    qwerty = qwerty + 1; 
    save(); 
    setTimeout(autosave, 60000); 
    update(); 
}