将此js移动到一个函数

时间:2017-03-22 09:23:55

标签: javascript

我怀疑这是非常微不足道的,但我有这段代码:

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());

1 个答案:

答案 0 :(得分:2)

假设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。