Dans la fonction de nœud suivante, il renvoie un tableau vide. Je ne sais pas pourquoi il fait ça. Serait-ce un problème d'attente asynchrone ? Apprécierait n'importe quelle aide. Merci

const folderPath = '/public/home.html'

function getCircuitAndFuse(folderPath){
  //List containing circuit name with its fuse
  let temporaryList = [];
  let finalCircuitAndFuseList = []

  fs.readFile(__dirname + folderPath, (error, data)=>{
    if(error){
      console.log(`Unable to read file: ${error}`)
    }else{

      var $ = cheerio.load(data)

      $('img').each(function(index, element){
        let getClassAtr = element.attribs.class
        temporaryList.push(getClassAtr.slice(0, getClassAtr.lastIndexOf(" ")))
      })

      finalCircuitAndFuseList = [...new Set(temporaryList)]
    }
  })
return finalCircuitAndFuseList;
}
let getInfo = getCircuitAndFuse(folderPath)

// Returning empty array
console.log(getInfo)
***Server code****
const server = http.createServer(function(req, res){
  res.writeHead(200, {'Content-Type': 'text/plain'})
  res.end()
}).listen(port, ()=>{
  console.log(`Server listening on port ${port}. Press Ctrl-C to terminate...`)
})
0
night_programmer 21 sept. 2021 à 19:40

2 réponses

Meilleure réponse

getCircuitAndFuse doit renvoyer Promise comme ceci :

function getCircuitAndFuse(folderPath) {
  return new Promise((resolve, reject) => {
    //List containing circuit name with its fuse
    let temporaryList = [];

    fs.readFile(__dirname + folderPath, (error, data) => {
      if (error) {
        console.log(`Unable to read file: ${error}`);
      } else {
        var $ = cheerio.load(data);

        $('img').each(function (index, element) {
          let getClassAtr = element.attribs.class;
          temporaryList.push(
            getClassAtr.slice(0, getClassAtr.lastIndexOf(' '))
          );
        });

        resolve([...new Set(temporaryList)]);
      }
    });
  });
}

getCircuitAndFuse(folderPath).then((getInfo) => {
  // do something with `getInfo`
});

1
Faruk 21 sept. 2021 à 16:45

Une autre alternative à la réponse de Faruk serait d'utiliser simplement fs.readFileSync au lieu d'envelopper votre fonction dans une promesse et d'exiger une partie de cette cérémonie supplémentaire. L'utilisation de fs.readFileSync garantira que votre fonction ne retourne pas prématurément.

Voici votre code réécrit dans cet esprit :

function getCircuitAndFuse(folderPath) {
  try {
    let temporaryList = [];
    const data = fs.readFileSync(__dirname + folderPath);
    const $ = cheerio.load(data);

    $("img").each(function (index, element) {
      let getClassAtr = element.attribs.class;
      temporaryList.push(getClassAtr.slice(0, getClassAtr.lastIndexOf(" ")));
    });

    return [...new Set(temporaryList)];
  } catch (error) {
    console.log(error);
  }
}
1
Dan Zuzevich 21 sept. 2021 à 16:58