У меня [неловкие] проблемы с коммандером 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 вызвал что-то внутренне, что позволяет программе завершиться, как только обратный вызов действия завершится. Как заставить его ждать завершения действительного действия?