如何成功等待FileReader.onload加载文件?

发布于 2025-02-13 05:45:56 字数 1184 浏览 0 评论 0原文

我要做的就是只需通过循环阅读多个文件信息即可。但是,即使我使用了Promise,JavaScript也不会等待FileReader.onload。

我们如何等待filereader.onload?这是代码示例。

    const promises = [];
    for (let i = 0; i < files.length; i++) {
      promises.push(
        new Promise((resolve, reject) => {
          const fileReader = new FileReader();
          const filename = files[i].object.name;

          audioDict.filename[i] = filename;
          fileReader.readAsArrayBuffer(files[i].object);
          fileReader.onload = function (e: any) {
            audioCtx
              .decodeAudioData(e.target.result)
              .then(function (decodedData: AudioBuffer) {
                // source.buffer = decodedData;

                audioDict.audio[i] = {};
                for (let c = 0; c < decodedData.numberOfChannels; c++) {
                  audioDict.audio[i][c] = decodedData.getChannelData(c);
                }
                audioDict.sr[i] = decodedData.sampleRate;
              });
          };
          resolve(audioDict);
        })
      );
    }

    Promise.all(promises).then(() => {
      // Do something using audioDict here.
      console.log("done!");
    });

what I want to do is just simply read multiple file information through for loop. However, Javascript does not wait for the FileReader.onload even if I used Promise.

How can we wait for the FileReader.onload ? Here is the code example.

    const promises = [];
    for (let i = 0; i < files.length; i++) {
      promises.push(
        new Promise((resolve, reject) => {
          const fileReader = new FileReader();
          const filename = files[i].object.name;

          audioDict.filename[i] = filename;
          fileReader.readAsArrayBuffer(files[i].object);
          fileReader.onload = function (e: any) {
            audioCtx
              .decodeAudioData(e.target.result)
              .then(function (decodedData: AudioBuffer) {
                // source.buffer = decodedData;

                audioDict.audio[i] = {};
                for (let c = 0; c < decodedData.numberOfChannels; c++) {
                  audioDict.audio[i][c] = decodedData.getChannelData(c);
                }
                audioDict.sr[i] = decodedData.sampleRate;
              });
          };
          resolve(audioDict);
        })
      );
    }

    Promise.all(promises).then(() => {
      // Do something using audioDict here.
      console.log("done!");
    });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三五鸿雁 2025-02-20 05:45:58

我想在Onload功能中移动您的分辨率函数调用将解决此问题。

const promises = [];
for (let i = 0; i < files.length; i++) {
  promises.push(
    new Promise((resolve, reject) => {
      const fileReader = new FileReader();
      const filename = files[i].object.name;

      audioDict.filename[i] = filename;
      fileReader.readAsArrayBuffer(files[i].object);
      fileReader.onload = function (e: any) {
        audioCtx
          .decodeAudioData(e.target.result)
          .then(function (decodedData: AudioBuffer) {
            // source.buffer = decodedData;

            audioDict.audio[i] = {};
            for (let c = 0; c < decodedData.numberOfChannels; c++) {
              audioDict.audio[i][c] = decodedData.getChannelData(c);
            }
            audioDict.sr[i] = decodedData.sampleRate;
            resolve(audioDict);
          });
      };
    })
  );
}

Promise.all(promises).then(() => {
  // Do something using audioDict here.
  console.log("done!");
});

I guess moving your resolve function call inside the onLoad function will solve this problem.

const promises = [];
for (let i = 0; i < files.length; i++) {
  promises.push(
    new Promise((resolve, reject) => {
      const fileReader = new FileReader();
      const filename = files[i].object.name;

      audioDict.filename[i] = filename;
      fileReader.readAsArrayBuffer(files[i].object);
      fileReader.onload = function (e: any) {
        audioCtx
          .decodeAudioData(e.target.result)
          .then(function (decodedData: AudioBuffer) {
            // source.buffer = decodedData;

            audioDict.audio[i] = {};
            for (let c = 0; c < decodedData.numberOfChannels; c++) {
              audioDict.audio[i][c] = decodedData.getChannelData(c);
            }
            audioDict.sr[i] = decodedData.sampleRate;
            resolve(audioDict);
          });
      };
    })
  );
}

Promise.all(promises).then(() => {
  // Do something using audioDict here.
  console.log("done!");
});

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文