Javascript承诺在此之前不等待解决

时间:2020-05-12 22:35:40

标签: javascript asynchronous ecmascript-6 promise async-await

我正在编写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

在此先感谢您的帮助和启发!

1 个答案:

答案 0 :(得分:0)

Configuration with app.json - Expo Documentation

await和香草保证之间的根本区别是await X()暂停执行当前函数,而promise.then(X)将X调用添加到回调链后继续执行当前函数。