0

Im currently working on opening and writing on an excel file using exceljs. However, the await is making an error

SyntaxError: await is only valid in async functions and the top level bodies of modules

Despite the function being in async. How can I resolve this problem? The following is the code that I am using

async function Process(filename){
  const workbook = new ExcelJS.Workbook();

  let myPromise = new Promise(function(myResolve, myReject) {
    // "Producing Code" (May take some time)
    try{
      await workbook.xlsx.readFile(filename)
      myResolve(); // when successful
    }catch(err){
      myReject();  // when error
    }

  });

  // "Consuming Code" (Must wait for a fulfilled Promise)
  myPromise.then(
    function() {
        /* code if successful */ 
    },
    function() {return false;}
  );
}
  • 2
    [What is the explicit promise construction antipattern and how do I avoid it?](https://stackoverflow.com/q/23803743) | [Is it an anti-pattern to use async/await inside of a new Promise() constructor?](https://stackoverflow.com/q/43036229) – VLAZ Jan 06 '22 at 10:16
  • 2
    The anonymous function you pass to `new Promise` is not `async` (but shouldn't be, see VLAZ's comment). – Quentin Jan 06 '22 at 10:18

1 Answers1

0

Agreeing with the comments, you should avoid the Promise constructor antipattern and never use await in the executor of a new Promise!

You should write either

function Process(filename){
  const workbook = new ExcelJS.Workbook();
  
  // "Producing Code" (May take some time)
  let myPromise =  workbook.xlsx.readFile(filename);

  // "Consuming Code"
  return myPromise.then(function() {
    /* code if successful, waiting for a fulfilled Promise */
    return …;
  }, function() {
    /* code when error, waiting for a rejected Promise */
    return false;
  });
}

or

async function Process(filename){
  const workbook = new ExcelJS.Workbook();

  try {
    // "Producing Code" (May take some time)
    await workbook.xlsx.readFile(filename);

    // "Consuming Code" (wait for the promise to be fulfilled)
    return …;
  } catch(err) {
    // Code when error in producing or consuming code
    return false;
  }
}
Bergi
  • 630,263
  • 148
  • 957
  • 1,375