在所有承诺得到解决后执行承诺

时间:2015-10-12 16:09:58

标签: javascript node.js promise ecmascript-6 es6-promise

我编写了一些迭代目录的代码,选择所有jpg文件,重命名它们,创建thumb文件夹并将它们放在该文件夹中。 我还编写了一个函数,每个图像生成一个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(已在代码的上半部分定义,此处未包含)返回undefined,因为它在所有先前的promise都被解析之前运行。

我已经阅读了Promise.all方法,并且我应该传递一个promises数组,问题是我不知道会返回多少个promise,而在我的代码中“renameTask”是行为的变量作为承诺接收者。

所以,我需要一些帮助 - 我真的很感激 - 要了解如何将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 >>>>");
    });

});

问题是我永远不会收到消息“&lt;&lt;&lt;&lt;&lt;所有承诺都已解决&gt;&gt;&gt;&gt;”,我知道它应该是一件小事我我失踪了......再次感谢你的帮助!

1 个答案:

答案 0 :(得分:6)

  

我已经阅读了Promise.all方法,并且我应该传递一个promises数组,问题是我不知道会返回多少个promise,而在我的代码中“renameTask”是行为的变量作为承诺接收者。

它并不像你想象的那么复杂。创建一个数组,将promises添加到它并将数组传递给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