我正在编写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()
在继续执行之前应等待承诺解决,但是无论我如何调整代码或切换为使用异步/等待,我都无法使承诺生效。
预期:
onloadend
success: offset=32
offset=32
实际
offset=0
onloadend
success: offset=32
在此先感谢您的帮助和启发!
答案 0 :(得分:0)
每Configuration with app.json - Expo Documentation“
await和香草保证之间的根本区别是
await X()
暂停执行当前函数,而promise.then(X)
将X调用添加到回调链后继续执行当前函数。