Обещания с вложенными циклами forEach, генерирующими значение разрешения - PullRequest
0 голосов
/ 24 октября 2018

Я бы хотел разрешить это обещание с помощью 'content', после того как оно заполнено парой циклов forEach.

 'use strict';

 const {promisify} = require('util');

 const fs = require('fs');
 const readFileAsync = promisify(fs.readFile);
 const readDirAsync = promisify(fs.readdir);
 const writeFileAsync = promisify(fs.writeFile);


function writeImportStatement(filepath) {
return new Promise((resolve, reject) => {
    let content = '';
    readDirAsync(`${filepath}/scss`)
      .then((files) => {
          files.forEach((file) => {
              fs.stat(`${filepath}/scss/${file}`, (err, stats) => {
                      if (stats.isDirectory()) {
                          readDirAsync(`${filepath}/scss/${file}`)
                          .then(scssfiles => {
                              scssfiles.forEach((scssfile) => {
                                  content += `@import "${filepath}/scss/${file}/${scssfile}"; \n`;
                              });
                          })
                      }
              });
          });
            console.log("loging import statement content: " + content);
            resolve(content);
      });
})
}

На данный момент оно не определено.

1 Ответ

0 голосов
/ 24 октября 2018

Я изменил это на async / await, чтобы его было легче читать, похоже, ваша главная проблема в том, что ваш files.forEach должен быть заключен в Promise.all с каждой итерацией, возвращающей обещание - если выЕсли вы хотите придерживаться только обещаний вместо асинхронного / ожидающего, ваши окончательные значения console.log и resolve должны быть в выражении then этого Promise.all.

'use strict';

 const {promisify} = require('util');

 const fs = require('fs');
 const readFileAsync = promisify(fs.readFile);
 const readDirAsync = promisify(fs.readdir);
 const writeFileAsync = promisify(fs.writeFile);


function writeImportStatement(filepath) {
return new Promise(async (resolve, reject) => {
    let content = '';
    const files = await readDirAsync(`${filepath}/scss`)
    const done = await Promise.all(files.forEach(async (file) => {
      return new Promise((resolve, reject) => {
        fs.stat(`${filepath}/scss/${file}`, async (err, stats) => {
          if(err) reject(err)
          if (stats.isDirectory()) {
            const scssfiles = await readDirAsync(`${filepath}/scss/${file}`)
            scssfiles.forEach((scssfile) => {
              content += `@import "${filepath}/scss/${file}/${scssfile}"; \n`;
            })
          }
          resolve()
        });
      });
    });
    console.log("loging import statement content: " + content);
    resolve(content);
})
}
...