Javascript 承诺解决了问题,但没有解决问题';t火
我创建了一个脚本,它循环遍历一组文件夹,并将每个文件夹处理成webpack包。这很有效,只是我不明白为什么循环中的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
承诺
没有得到解决
我尝试过的一些事情:
- 如果我将
放在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
中,因为:-)我已经将其转换为可运行的代码段