我创建了一个脚本,该脚本循环遍历一堆文件夹并将它们分别处理为webpack捆绑包。这很有效,除了我无法弄清楚循环中的Promise
为什么无法解析。
我尝试过的一些事情:
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
});
答案 0 :(得分: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 :(得分:-1)
我认为问题与您进行递归调用的方式有关。
尝试做到
if (script_folders.length > 0) {
process_script_folders().then(resolve);
} else {
resolve();
}