javascript - 如何将 js filereader 结果保存到变量中以供进一步使用?

标签 javascript angularjs file gis openlayers

我正在尝试将本地 .json 文件上传到我的网络应用程序中。我已经到了可以在开发工具中显示该文件的地步,但我无法使其可供进一步使用。我怀疑问题出在我处理(或不处理)文件阅读器异步行为的方式上。

整个过程都在 Angularjs (1.7) 环境中运行,因此代码段的语法也是如此。预期用途是在 openlayers map 上显示读取的数据。

    this.jsonSelected = function(newFile) {
        let reader = new FileReader();
        let result = 'empty';
        reader.readAsText(newFile);
        reader.onload = function(e) {
            result = e.target.result;
            console.log('in onload', result);
            this.result = e.target.result;
        };
        console.log(this.result);
    };

    this.test = function() {
        console.log(this.file);
    }

我希望代码两次注销文件内容。一旦出现“console.log('in onload',结果);”还有一次关于“console.log(this.result);”。第一个按预期工作。但出于某种原因,第二个不会。控制台中的顺序也被翻转,console.log(this.result)出现在 inload 日志之前,如您在此 screenshot of the console 中所见。 .

我尝试了几种变体,翻转名称,更改 this.等等,但无济于事。这就是为什么我认为我搞砸了异步数据的处理。此外,屏幕截图(更具体地说是日志中的行)表明存在某种计时问题。

最佳答案

经过进一步研究和反复试验后,我找到了解决办法。代码现在看起来像这样:

function readFile(newFile) {
    return $q(function(resolve, reject) {
        let reader = new FileReader();
        reader.onload = function(event) {
            resolve(event.target.result);
        };
        reader.onerror = function(event) {
            reject(event);
        };
        reader.readAsText(newFile);
    });
}

this.jsonSelected = function(newFile) {
    readFile(newFile).then(function(data) {
        console.log(data);
        set$scopeFile(data);
    }, function(errData) {

    });
};

谢谢 Ben,你让我走上了正轨,我太专注于寻找处理异步部分的方法,而忽略了范围问题。如果有人有一些关于异步 JS 的“傻瓜式”文档,我将不胜感激,因为我无法理解这个主题。

我已经使用 angularjs 内置的 $q 服务将整个读取过程包装到 promise 中。然后可以用 .then 链接起来。

关于javascript - 如何将 js filereader 结果保存到变量中以供进一步使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55493408/

相关文章:

javascript - 火狐。类型错误 : 0 is read-only

使用带有线程锁的文件句柄时出现Python错误 "I/O operation on closed file"

javascript - 我对 IE9 中的打印格式有疑问

javascript - 扩展 HTMLElement 原型(prototype)

javascript - 尝试仅在源为 jpg 时加载函数

java - 执行ajax时出现问题

javascript - 将controller和controllerAs设置为相同的字符串

angularjs - 为 AngularJS 动态插入 Google 标签 (gtag.js) 跟踪 ID

python - 按字节数划分文件

python - 打开用于写入和读取大文件的Python