【发布时间】:2020-08-28 23:15:34
【问题描述】:
我正在编写 JavaScript 代码来解析一个巨大的文件(几 GB),并且我正在使用 FileReader 的 readAsArrayBuffer 函数和 promise(见下文):
function readRaw(fc, length) {
const fileReader = new FileReader();
return new Promise((resolve, reject) => {
fileReader.onloadend = function(value) {
console.log("onloadend");
fc.offset += length;
resolve(new Uint8Array(value.result));
}
fileReader.onerror = (err) => {
console.error(err);
reject(err);
}
const slice = fc.handle.slice(fc.offset, fc.offset + length);
fileReader.readAsArrayBuffer(slice);
});
}
function parsefile(file) {
let fc = { handle: file, offset: 0 };
let buffer = {};
var promise = readRaw(fc, 32);
promise.then(function(value) {
console.log("success: offset=" + fc.offset)
buffer = value
}).catch((e) => {
console.error(e);
});
console.log("offset=" + fc.offset);
}
document
.getElementById('fileToRead')
.addEventListener('change', function () {
let file = this.files[0];
if (file) {
parsefile(file);
}
}, false);
我的期望是Promise.prototype.then() 应该等待承诺解决后再继续,但无论我如何调整代码或切换到使用 async/await,我都无法让它工作。
预期:
onloadend
success: offset=32
offset=32
实际
offset=0
onloadend
success: offset=32
提前感谢您的帮助和启发!
【问题讨论】:
标签: javascript asynchronous ecmascript-6 promise async-await