【问题标题】:Javascript promise not waiting to resolve before then [duplicate]Javascript承诺在此之前不等待解决[重复]
【发布时间】: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


    【解决方案1】:

    Why await beats Promise.then(...)"

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

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 2020-06-20
      • 2019-04-29
      • 1970-01-01
      相关资源
      最近更新 更多