2012-09-29 42 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文件的处理是否有问题。