Javascript 使用嵌套的forEach循环生成解析值的承诺

Javascript 使用嵌套的forEach循环生成解析值的承诺,javascript,ecmascript-6,es6-promise,Javascript,Ecmascript 6,Es6 Promise,我想用“内容”来解决这个承诺,在它被几个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.write

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

目前它还没有定义

我将其改为async/await,以使其更易于阅读,看起来您的主要问题是您的
文件。forEach
需要包装在
承诺中。所有的
每次迭代都会返回一个承诺-如果您希望只遵守承诺而不是async/await,您最后的
控制台.log
解析
需要在
中,然后
声明该
承诺。所有

“严格使用”;
const{promisify}=require('util');
常数fs=要求('fs');
const readFileAsync=promisify(fs.readFile);
const readDirAsync=promisify(fs.readdir);
const writeFileAsync=promisify(fs.writeFile);
函数writeImportStatement(文件路径){
返回新承诺(异步(解析、拒绝)=>{
让内容=“”;
const files=await readDirAsync(`${filepath}/scss`)
const done=wait Promise.all(files.forEach)(异步(file)=>{
返回新承诺((解决、拒绝)=>{
fs.stat(`${filepath}/scss/${file}`,async(err,stats)=>{
如果(错误)拒绝(错误)
if(stats.isDirectory()){
const scssfiles=wait readDirAsync(`${filepath}/scss/${file}`)
forEach((scssfile)=>{
content+=`@import“${filepath}/scss/${file}/${scssfile}”;\n`;
})
}
解决()
});
});
});
console.log(“登录导入语句内容:”+content);
解决(内容);
})

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