2012-09-29 40 views
13

作爲一個jQuery/D3-小白回到陣,似乎我無法弄清楚如何使這項工作:從d3.json()

supdog = d3.json(dataPath, function(jsondata){ 
    return jsondata; 
    }) 
    console.log(supdog); 

在此先感謝。

回答

20

除了你的問題描述非常簡潔的事實,這個問題似乎是你對什麼是返回什麼的假設。

函數d3.json()是一個異步函數,直接返回(我假設有一個未定義的值)。只有當從後端接收到數據時,纔會調用傳遞給它的回調函數。很明顯,上下文在這裏是不同的,你的回調函數的返回值不會自動成爲d3.json的返回值(因爲這個返回值已經在「long」之前)。

你想要做什麼大概是這樣的:

var jsondata; 
    d3.json(dataPath, function(dataFromServer) { 
     jsondata = dataFromServer; 
    } 
    console.log(jsondata); 

更新1: 很顯然,上面的例子還沒有完全正確的。調用console.log()是在d3.json()返回後直接進行的。因此,服務器可能還沒有完全發送回覆。因此,您只能在返回回調時訪問數據。固定例如:

var jsondata; 

    function doSomethingWithData() { 
     console.log(jsondata); 
    } 

    d3.json(dataPath, function(dataFromServer) { 
     jsondata = dataFromServer; 
     doSomethingWithData(); 
    }) 

對於(有點愚蠢,但)工作示例,請參閱:http://jsfiddle.net/GhpBt/10/

更新2: 上面的例子說明了以何種順序執行的代碼,但並沒有真正值得價格最漂亮的代碼。我自己不會用這種「全局」變量,並簡化上面的例子:

function doSomethingWithData(jsondata) { 
     console.log(jsondata); 
    } 

    d3.json(dataPath, doSomethingWithData); 

注doSomethingWithData如何直接傳遞在一個匿名的內部函數調用分開它來代替d3.json。

說明:這不是d3.js的特別問題。基本上,所有異步的javascript函數都可能以類似的方式運行。如果他們返回一些東西,它不會是傳遞迴調的返回值。

+0

謝謝,但不幸的是,這也將返回「未定義」。 –

+0

你確定你確實得到了結果嗎?即你可以嘗試把console.log()放在函數體中(並把dataFromServer放在那裏)。此外,在jsfiddle.net上展示問題的最小示例將有助於理解您到底在做什麼。 –

+0

是的,一個數組作爲結果給出 –

0

我知道,這是一個非常古老的職位,但我最近遇到了類似的問題,並找到了以下解決方案,這可能值得分享:

在我的情況下,JSON文件的語法被打破。默認情況下,在這種情況下瀏覽器中不會出現任何錯誤,除非您通過錯誤處理來增強@BertjanBroeksema建議的功能。類似這樣的:

function doSomethingWithData(error, jsondata) { 
    console.log("error:", error) 
    console.log(jsondata); 
} 

這樣你會看到JSON文件的處理是否有問題。