所有承诺解决后执行承诺

我已经写了一些遍历目录的代码,选取所有的jpg文件,重命名它们,创build拇指文件夹,并将它们放在该文件夹中。 我也编写了一个函数,每个图像生成一个html块,在forEach循环结束时应该把所有的输出写入一个文件。

// Read the directory fs.readdir(dir, function (err, files) { // Return the error if something went wrong if (err) { console.log("Something went wrong"); } //Make thumbs dir fs.mkdirSync(thumbsFolder); // For every file in the list files.forEach(function (file) { var extension = path.extname(file); if (extension === ".jpg") { //Rename images var renameTask = renameImages(file, newFileName, extension); //Generating thumbs renameTask.then(function (newFileName) { generateThumbs(dir, newFileName, thumbsFolder) console.log("Promise resolved! Generating thumb for: " + newFileName); galleryHtml += generateThumbsGallery(newFileName, articleTitle); }, function (err) { console.log(err); }); } }); //Gallery output console.log("Gallery Output: "); console.log(galleryHtml); 

});

我的问题是,作为逻辑听起来,galleryHtml(这是已经定义在代码的上半部分,而不是在这里包括)返回未定义,因为它在所有先前的承诺解决之前运行。

我已经阅读了有关Promise.all方法,并且我应该传递一个Promises数组,问题是我不知道将会返回多less个promise,并且在我的代码中“renameTask”是作为promise的variables接收器。

所以,我需要一些帮助 – 我真的很感激 – 理解如何把forEach作为一个承诺本身,毕竟每个承诺都已经解决了,然后执行最后的承诺。

非常感谢。

更新:

菲利克斯,非常感谢,我现在更近了

 // Read the directory fs.readdir(dir, function (err, files) { // Return the error if something went wrong if (err) { console.log("Something went wrong"); } var promises = []; //Make thumbs dir fs.mkdirSync(thumbsFolder); // For every file in the list files.forEach(function (file) { var extension = path.extname(file); if (extension === ".jpg") { //Rename images var renameTask = renameImages(file, newFileName, extension); promises.push(renameTask.then(function (newFileName) { generateThumbs(dir, newFileName, thumbsFolder) console.log("Promise resolved! Generating thumb for: " + newFileName); galleryHtml += generateThumbsGallery(newFileName, articleTitle); }, function (err) { console.log(err); }) ); console.log("<<<< Promises length: " + promises.length + " >>>>"); } }); Promise.all(promises).then(function () { console.log("<<<<< All promises were resolved >>>>"); }); }); 

问题是,我从来没有得到消息“<<<<<所有的承诺已经解决了>>>>”,我知道这应该是一个小东西,我失踪了..再次感谢您的帮助!

我已经阅读了有关Promise.all方法,并且我应该传递一个Promises数组,问题是我不知道将会返回多less个promise,并且在我的代码中,“renameTask”是作为promise的variables接收器。

这并不像你想象的那么复杂。 创build一个数组,向它添加promise,并将数组传递给Promise.all

 var promises = []; // array of promises files.forEach(function (file) { var extension = path.extname(file); if (extension === ".jpg") { var renameTask = renameImages(file, newFileName, extension); promises.push(renameTask.then(...)); // add promise } }); Promise.all(promises).then(...); // use array