我正在编写javascript代码来解析一个巨大的文件(几GB),我使用FileReader的readAsArrayBuffer函数和承诺(见下文)。
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()
应该等待承诺解决后再继续,但无论我如何调整代码或切换到使用asyncawait,都无法让它工作。
预期的。
onloadend
success: offset=32
offset=32
实际
offset=0
onloadend
success: offset=32
先谢谢你的帮助和启发!
每 为什么 await 胜过 Promise.then(...)?"
await和vanilla承诺的根本区别在于
await X()
暂停当前函数的执行,而promise.then(X)
在回调链中加入X调用后继续执行当前函数。