Javascript 使用嵌套的forEach循环生成解析值的承诺
我想用“内容”来解决这个承诺,在它被几个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
'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
来全部读取,然后解决这个问题。但我认为以这种方式嵌套承诺可能不是一个干净的解决方案。