关于 program.parse方法
老师,为什么.parse方法放在if判断后,这个args打印为undefined。
.PARSE方法放在if判断前边,这个args就可以正常打印出数组??
正在回答 回答被采纳积分+1
同学你好,在.parse执行前脚手架还未解析参数所以获取不到参数,在.parse后可以获取到参数。这是由commander框架决定的代码执行顺序。
而且有一个非常重要的点:commander的代码不是顺序执行的(不是按照书写顺序执行的),这一点可以通过下面的方法得到验证。
建议你用debug调试下面的代码,跟踪代码执行顺序,一目了然。
代码如下:
// test.js const commander = require('commander'); const program = new commander.Command(); // option的第三个参数可以是函数,会对输入的值进行转化 program .command('test') .option('-i, --integer <n>', '整形参数', parseInt) .option('-r, --range <a>..<b>', '区间值', rangeFn) .action((cmdObj) => { console.log('执行命令的action') console.log(`参数 integer = `, cmdObj.integer); console.log(`参数 range = `, cmdObj.range); }); // 对option:range进行处理,转换为数组 function rangeFn(val) { console.log('处理option的参数') return val.split('..').map(Number); } console.log('在parse前:', program.args); program.parse(process.argv); console.log('在parse后:', program.args);
在命令行执行:
node test.js test -i 110电话号码 -r 1..10
单步调试的话,会发现代码执行顺序是:
1、program.command -> .option -> .option -> .action 此时只是收集action的参数callback,并没有执行对应callback
2、console.log('在parse前:' ...) 此时脚手架还未对命令行输入的参数进行解析,所以打印结果是空对象
3、program.parse 此时开始解析命令行输入的参数
4、注意:解析参数后流程会跳转到对option的处理逻辑,然后跳转到action的callback逻辑,最后才是.parse下面的代码。
5、如果有设置option的第三个参数是函数,则会对option的值进行处理,比如上面的rangeFn,会将输入的字符串"1..10"转换为数组range=[1,10]
6、执行action的callback逻辑
7、最后才是parse下面的console.log('在parse后')。
最终控制台输出:
在parse前: undefined 处理option的参数 执行命令的action 参数 integer = 20 参数 range = [ 1, 10 ] 在parse后: [ 'test', '-r', '1..10', '-i', '20' ]
希望我的回答对你有帮助。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星