Обещание с двумя вложенными циклами Javascript - PullRequest
1 голос
/ 09 марта 2020

Я хотел бы создать асинхронный метод с обещанием, но я не могу понять, почему он не работает с моей программой ниже:

app.get('/historique', function (req, res) {

  const pathFolders = `.\\..\\website\\src\\assets\\covering\\`;

  const promise2 = new Promise(function (resolve, reject) {

    fs.readdirSync(pathFolders).forEach(folder => {

      recursive(`${pathFolders}\\${folder}\\`, function (err, files) {

        var datapath = [];

        files.forEach(file => {

          console.log("1");

        });

        console.log("2");
      });

      console.log("3");
      resolve("3");
    });

  });

  promise2.then(function (value) {
    console.log("end")
    res.status(200).send("end")
  });

})

Обычно я хотел бы, чтобы программа отображалась в порядок на console.log 1 1 1 2 1 1 2 ... затем 3 и, наконец, "конец". Но console.log покажет мне сначала 3, затем "конец", затем 1 1 1 2 1 1 2 ...

Можете ли вы помочь мне, пожалуйста. Я думаю, что это из-за for l oop, но я не могу решить эту проблему.

1 Ответ

2 голосов
/ 10 марта 2020

Как уже объяснил Э. Закариас в своем комментарии, реализация recursive-readdir реализована асинхронно. Но он поддерживает использование с Promise, пропуская аргумент обратного вызова.

Затем вы можете вернуть Promise из функции итератора и ждать его с помощью Promise.all.

Это сделает ваш код намного проще:

app.get('/historique', function (req, res) {

  const pathFolders = `.\\..\\website\\src\\assets\\covering\\`;

  const promise2 = Promise.all(
    // readdirSync returns an Array of folder name strings
    // Call Array.map to transform it into an array of Promise
    fs.readdirSync(pathFolders).map(folder => {
      // return a Promise for the folder from the map function
      return recursive(`${pathFolders}\\${folder}\\`).then(files => {
        var datapath = [];
        files.forEach(file => {
          console.log("1");
        });
        console.log("2");
      });
    });
  );

  promise2.then( value => {
    console.log("end")
    res.status(200).send("end")
  });

})

Важными аспектами здесь являются понимание работы Array.prototype.map и Promise.all .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...