Javascript承诺不等待解决,然后[重复]。

问题描述 投票:0回答:1

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

先谢谢你的帮助和启发!

javascript asynchronous ecmascript-6 promise async-await
1个回答
0
投票

为什么 await 胜过 Promise.then(...)?"

await和vanilla承诺的根本区别在于 await X() 暂停当前函数的执行,而 promise.then(X) 在回调链中加入X调用后继续执行当前函数。

© www.soinside.com 2019 - 2024. All rights reserved.