Обещание разрешается, но не срабатывает - PullRequest
0 голосов
/ 13 сентября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

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

Я думаю, что проблема связана с тем, как вы делаете рекурсивный вызов.

Попробуйте сделать это

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