1

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!");
    });
S. Yong
  • 79
  • 1
  • 5

1 Answers1

1

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!");
});

Shakirul Hasan
  • 678
  • 1
  • 5
  • 14