我怀疑这是非常微不足道的,但我有这个代码:
var latestMth;
d3.csv("data/blah.csv", function(rows) {
x = rows.map(function(d) {
return parseDate(d.dt)
});
latestMth = formatDateOutputMTH(d3.max(d3.values(x)));
});
...
...
.text("Month is " + latestMth);
它可以正常显示“月份是 3 月 17 日”。
我尝试将上述内容设为函数,但结果现在显示为“月份未定义”。为什么会发生这种情况:
var latestMth = function() {
d3.csv("data/blah.csv", function(rows) {
x = rows.map(function(d) {
return parseDate(d.dt)
});
return formatDateOutputMTH(d3.max(d3.values(x)));
});
}
...
...
.text("Month is " + latestMth());
最佳答案
假设 d3.csv() 不是异步的。
因为你没有从函数中返回:
var latestMth = function() {
return d3.csv("data/blah.csv", function(rows) { // added return
x = rows.map(function(d) {
return parseDate(d.dt)
});
return formatDateOutputMTH(d3.max(d3.values(x)));
});
}
注意,如果是异步的,你可以使用 Promise:
function setLatestMonth() {
return new Promise((resolve, reject) => {
d3.csv("data/blah.csv", function(rows) {
x = rows.map(function(d) {
return parseDate(d.dt)
});
resolve(formatDateOutputMTH(d3.max(d3.values(x))));
});
});
}
setLatestMonth().then(latestMonth => {
// ...
// ...
// ...
.text("Month is " + latestMonth);
});
我不知道 d3.csv() - 如果它已经返回一个 Promise,您可以简单地链接该 Promise,而不是自己创建一个新的 Promise。
关于javascript - 将此js移至函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42947341/