使用then()后无法更改承诺待处理状态

时间:2020-02-19 12:54:22

标签: javascript ecmascript-6 async-await es6-promise ecmascript-7

我试图从一开始就将CSV file加载到应用程序中,并将值保留在变量中,然后从其他函数中调用它,而不是一直then进行访问

我的代码是

var DVizModule = (() => {

    let dataset = [];

    let _data = async () => {
        const data = await d3.csv("data/alphabet.csv");
        return data;
    }
    let data = _data().then(data => {
        dataset = data;
        return dataset;
    })

    return {
        data: data
    }
})();
console.log(DVizModule.data);

它返回

Promise pending proto: Promise

PromiseStatus: "resolved"

PromiseValue: Array(26)

我写的时候

const t = async function() {
    const data = await d3.csv("data/alphabet.csv");
    return data;
}
t().then(result => console.log(result))

它完美地返回文件 我正在尝试通过

访问文件内容
DVizModule.data

1 个答案:

答案 0 :(得分:0)

如果要同步访问data,则应将其声明为纯值,而不是诺言。这样的事情应该可以解决问题:

const DVizModule = {};
d3.csv("data/alphabet.csv").then(data => DVizModule.data = data);

当然请注意,DVizModule.data将是undefined,直到请求实际完成为止。如果要确保实际存在值,则必须将外部上下文包装到async函数中,并在开始时等待数据。这样,您既可以确保在代码访问值时又存在该值并以同步方式使用它。

希望我能正确回答您的问题,而不是试图解决错误的问题;)