Javascript 承诺解决了问题,但没有解决问题';t火

Javascript 承诺解决了问题,但没有解决问题';t火,javascript,node.js,promise,gulp,resolve,Javascript,Node.js,Promise,Gulp,Resolve,我创建了一个脚本,它循环遍历一组文件夹,并将每个文件夹处理成webpack包。这很有效,只是我不明白为什么循环中的承诺没有得到解决 我尝试过的一些事情: 如果我将console.log(“hello world”)放在resolve()的前面,在}else{…}中,它会输出日志 如果我将resolve()移出}else{…},它会解决,但我的吞咽任务的其余部分不会继续(单独但相关的问题) 如果能帮我弄清楚,我将不胜感激。最相关的代码块在下面,其余部分在下面的链接中 // process al

我创建了一个脚本,它循环遍历一组文件夹,并将每个文件夹处理成webpack包。这很有效,只是我不明白为什么循环中的
承诺
没有得到解决

我尝试过的一些事情:

  • 如果我将
    console.log(“hello world”)
    放在
    resolve()
    的前面,在
    }else{…}
    中,它会输出日志
  • 如果我将
    resolve()
    移出
    }else{…}
    ,它会解决,但我的吞咽任务的其余部分不会继续(单独但相关的问题)
如果能帮我弄清楚,我将不胜感激。最相关的代码块在下面,其余部分在下面的链接中

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

我认为问题与递归调用的方式有关

试着去做吧

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

你不断地呼唤你的承诺,但是除了最后一个承诺,这些承诺都不会解决,因为你已经把你的决心放在了你的决心条款里面。我认为,如果您将解析放在else之外,并保持其余部分不变,那么它应该在完成递归后解析

if (script_folders.length > 0) {
    process_script_folders();
} 
resolve();
你能那样试试吗

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

设i=0
常量示例_处理=()=>{
返回新承诺((解决)=>{
我++
设置超时(解析,1000);
}).然后(()=>{
控制台日志(i);
返回i<10?示例_处理():“完成”
});
};

示例_processing().then(console.log)
是否需要
返回resolve()?您的递归调用
process\u script\u folders()
无法解析外部服务器返回的承诺call@bergi我想我明白你的意思,但我不太清楚该怎么处理。承诺对我来说还是新鲜事;您能否提供一个如何实现这一点的示例?您可以递归调用process_script_folders()方法,并在另一个promise中解析该promise。resolve()将不会被调用,因为您没有解析()您的第一个承诺,因此then方法将不会对第一个承诺执行,因为您的resolve方法也不会被调用。这是一个想法,但这是:-/如果他不想这样做,那么我认为唯一的选择是迭代而不是递归地执行。在递归调用完成后,您将如何使其解析?不,递归很好。但要正确地执行此操作,您需要
解析(process_script_folders())
,或者最好只将
解析
作为回调传递给
process_scripts
,然后在
然后
回调中执行所有其他操作,您可以
返回process_script_folders()。否,如果在完成最内层递归之前解析,则为这种方式calls@Bergi你是对的。请检查我修改过的答案。从
setTimeout
调用
process\u script\u folders
没有任何好处,但最后一个片段非常完美@Bergi我举这个例子只是为了模拟一些处理过程。我意识到拥有相同的函数名有点让人困惑,我现在正在编辑它。这只是为了说明。最后一段代码是我实际提出的解决方案。啊,我明白了。尽管如此,
setTimeout
应该严格地在
newpromise
中,因为:-)我已经将其转换为可运行的代码段