CommanderJS не ждет обещания решить - PullRequest
0 голосов
/ 04 сентября 2018

У меня [неловкие] проблемы с коммандером JS и обещаниями. Я создаю инструмент CLI, который выполняет несколько операций с файловой системой, которые заключены в обещания и по большей части работают. Однако, добавляя больше работы с файловой системой через обещания, я заметил, что команда преждевременно прекратит работу. Я попытался упростить свой пример, имитируя работу с вызовом setTimeout, пытаясь определить, где я запутался. Вот код, с которым я играю, чтобы продемонстрировать проблему:

var program = require('commander');
fs = require('fs');
path = require('path');


program
    .version('0.0.1')
    .command('add [options] <package.json>', 'Adds Tizen commands line build support to an existing Tizen project.').alias('a')
    .option('-f, --file [package.json]', 'File which contains the package.json project description')
    .option('-c, --config [config]', 'Path to the config.xml where the projectId is read from.')
    .option('-p, --projectid [projectid]', 'The project Id to use in the project.')

    .action(() => {
        console.log('taking action...');
        return new Promise((resolve) => {

                console.log('setting timeout...');

                setTimeout(() => {
                    console.log('Timeout!');
                    resolve();
                } ,2000);

            }
        ).then(() => console.log('Done'));
    })
    .parse(process.argv);

console.log('parse completed...');
console.log('running outer promise...');
return new Promise((resolve) => {

        console.log('setting timeout...');

        setTimeout(() => {
            console.log('Timeout!');
            resolve();
        } ,2000);

    }
).then(() => console.log('Done'));

Когда я запускаю это, я получаю:

taking action...
setting timeout...
parse completed...
running outer promise...
setting timeout...

Process finished with exit code 0

Однако, когда я закомментирую вызов для разбора следующим образом, он, похоже, ожидает внешнего обещания:

    .action(() => {
        console.log('taking action...');
        return new Promise((resolve) => {

                console.log('setting timeout...');

                setTimeout(() => {
                    console.log('Timeout!');
                    resolve();
                } ,2000);

            }
        ).then(() => console.log('Done'));
    })
    //.parse(process.argv);

console.log('parse completed...');
console.log('running outer promise...');
return new Promise((resolve) => {

        console.log('setting timeout...');

        setTimeout(() => {
            console.log('Timeout!');
            resolve();
        } ,2000);

    }
).then(() => console.log('Done'));

Здесь я получаю:

parse completed...
running outer promise...
setting timeout...
Timeout!
Done

Process finished with exit code 0

Это как если бы вызов parse вызвал что-то внутренне, что позволяет программе завершиться, как только обратный вызов действия завершится. Как заставить его ждать завершения действительного действия?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...