承诺解决但不解雇

问题描述 投票:0回答:2

我创建了一个循环遍历一堆文件夹的脚本,并将它们分别处理到webpack包中。这很好用,除了我无法弄清楚为什么循环周围的Promise无法解析。

我试过的一些事情:

  • 如果我在console.log("hello world")之前放置一个resolve(),在} else { ... }内,它会输出日志。
  • 如果我将resolve()移出} else { ... },它就会结算,但我的gulp任务的剩余部分不会继续(单独但相关的问题)。

我很感激帮助解决这个问题。最相关的代码块在下面,其余部分位于下面的链接中。

// process all the script folders
const process_script_folders = () => {
   return new Promise((resolve) => {
       const FOLDER = script_folders.shift();

       // lint all scripts, except for critical
       if (FOLDER !== "critical") {
           const linted = lint_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*");
           merged_streams.add(linted);
       }

       process_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*").then((processed) => {
           merged_streams.add(processed);

           if (script_folders.length > 0) {
               process_script_folders();
           } else {
               // @TODO figure out why this isn't resolving
               resolve();
           }
       });
   });
};

return process_script_folders().then(() => {
    // ... do stuff
    console.log("Testing"); // currently never output
});

https://github.com/JacobDB/new-site/blob/dfeeb3260ab1b314e7562ef313c181adf2ef7f9c/gulp-tasks/scripts.js#L86-L89

javascript node.js promise gulp resolve
2个回答
2
投票

你递归地调用了你的承诺,但是这些承诺都不会解决上一个承诺,因为你已经将你的决心放在了你的resolve子句中。我认为如果你把决心放在其他地方之外并保持其余部分相同它应该在完成递归后解决。

if (script_folders.length > 0) {
    process_script_folders();
} 
resolve();

你能这样试试吗?

编辑:@Bergi是对的。像我这样做,我认为应该让它正常工作。首先是我建议你做的一个小例子:

let i = 0
const example_processing = () => {
    return new Promise((resolve) => {
        i++
        setTimeout(resolve, 1000);
    }).then(() => {
        console.log(i);
        return i < 10 ? example_processing() : "done"
    });
};
example_processing().then(console.log);

关于你的代码,我想这看起来更像是这样:

const process_script_folders = () => {
    return new Promise((resolve) => {
        const FOLDER = script_folders.shift();

        // lint all scripts, except for critical
        if (FOLDER !== "critical") {
            const linted = lint_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*");
            merged_streams.add(linted);
        }

        process_scripts(js_directory, FOLDER + ".js", source_directory + "/" + FOLDER + "/**/*").then((processed) => {
            merged_streams.add(processed);
            resolve();
        });
    }).then(() => script_folder.length > 0 ? process_script_folders() : "done");
 };

-1
投票

我认为这个问题与你进行递归调用的方式有关。

尝试制作它

if (script_folders.length > 0) {
    process_script_folders().then(resolve);
} else {
    resolve();
}
© www.soinside.com 2019 - 2024. All rights reserved.