首先,我是javascript的新手,这是我用这种语言的第一个'项目',所以我提前为我的noobiness道歉。
我在这个项目中使用传单和D3,我似乎无法使用此函数返回除“未定义”之外的任何内容。起初我虽然没有正确地从函数返回,所以我试图在这里以较小的比例复制错误:
然而,这对我有用,所以现在我有点迷失了。
这是我的代码的简单版本,我尝试删除所有似乎不相关的内容并更改名称以使其更容易理解:
$(function () {
...
function getThings(code) {
d3.csv("data.csv", function(data){
for (var i = 0, len = data.length; i < len; i++){
if (data[i].code == code){
alert("return 5!")
return 5;
}
else{
return 0;
}
}
})
}
L.geoJson( features, {
style: function (feature) {
return { opacity: 0, fillOpacity: 0.5, fillColor: "#0f0" };
},
onEachFeature: function(feature, layer){
var test = getThings(5);
alert(test);
...
我一直都是“回归5”!警报然后在警报(测试)我得到“未定义”。
有人知道我哪里出错吗? 提前谢谢!
答案 0 :(得分:2)
d3.csv
实际上returns a useful value可以用于附加相关的回调。但是,因为getThings
没有有一个return语句,所以在调用时它总是会产生未定义的。
请记住,return
适用于最近的封闭函数,包括匿名函数,例如提供的回调。
function getThings(code) {
/* Without an explicit return, a function always evaluates
to undefined when invoked. */
return d3.csv("data.csv", function(data){ .. });
})
var test = getThings(..);
/* Now test is NOT undefined, but is also NOT the data
for the asynchronous reasons discussed elsewhere.
See the link above for correct usage. */
test.row(..);
答案 1 :(得分:1)
d3.csv()
是异步的。这意味着,函数getThings()
启动d3.csv()
并立即返回undefined
发出逗号分隔值(CSV)文件的HTTP GET请求 在指定的网址。假设文件内容是 RFC4180兼容。请求的mime类型将是“text / csv”。 请求以异步方式处理,以便此方法返回 打开请求后立即。
答案 2 :(得分:0)
由于Javascript Async Nature,这种情况正在发生。使用函数Callback。