Promise带有两个for循环嵌套的Javascript



我想创建一个带有promise的异步方法,但我不明白为什么它不能与下面的程序一起使用:

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

通常,我希望程序按顺序显示在控制台上。log 1 1 1 1 2 1 2。。。然后是3,最后是"结束"。但console.log首先显示3,然后显示"结束",然后显示1 1 1 2 1 2。。。

你能帮帮我吗。我想这是因为for循环,但我不能解决这个问题。

正如E.Zacarias在他的评论中所解释的,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.的工作原理

最新更新