【问题标题】:Promises with nested forEach loops generating resolve value带有嵌套 forEach 循环的 Promise 生成解析值
【发布时间】:2018-10-24 13:05:02
【问题描述】:

我想用“内容”来解决这个承诺,在它被几个 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);
      });
})
}

目前它是未定义的。

【问题讨论】:

  • 您正在解决的承诺之前是您从文件中读取的值得到解决。
  • 第二个readDirAsync需要被承诺。
  • @joseatchang 是的,我也这么认为。不过,我不清楚如何解决这个问题。
  • 您可以在将所有文件读入 Promise 时进行包装,然后使用 Promise.all 读取所有文件,然后解析该结果。但我认为以这种方式嵌套 promise 可能不是一个干净的解决方案。

标签: javascript ecmascript-6 es6-promise


【解决方案1】:

我将其更改为 async/await 以使其更易于阅读,看起来您的主要问题是您的 files.forEach 需要包装在 Promise.all 中,每次迭代都会返回一个承诺 - 如果您如果想坚持只使用 promise 而不是 async/await,则您的最终 console.logresolve 需要在 Promise.allthen 语句中。

'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);
})
}

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2017-01-13
    • 1970-01-01
    • 2019-03-10
    • 2021-06-19
    • 2013-03-02
    相关资源
    最近更新 更多