Вы рекурсивно вызываете свое обещание, но ни одно из этих обещаний не будет решено, кроме последнего, потому что вы указали свою решимость в своем предложении о разрешении.Я думаю, что если вы поместите разрешение вне else и оставите остальное таким же, как оно должно разрешиться после завершения рекурсии.
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");
};