这个问题已经在这里有了答案: > How to return value from an asynchronous callback function? 3个
首先,我是javascript的新手,这是我使用该语言的第一个“项目”,因此,对于我的不便,我深表歉意.
我在此项目中使用了传单和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”!警报,然后在警报(测试)下,我得到“未定义”.
有人知道我哪里出问题了吗?
提前致谢!
解决方法:
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(..);