如何在repl/bash w/Node.js Commander中继续接收异步console.log消息
How to continue receiving asynchronous console.log messages in repl/bash w/ Node.js Commander?
我有一个使用Commander Library构建的Node.js CLI。这是主执行文件中的代码。
#!/usr/bin/env node
var program = require('commander');
var scmStash = require('./lib/hdqc/scmStash');
var command = {};
program
.version('0.0.1')
.option('-P, --Projects', 'List Projects')
.option('-R, --Repositories', 'List All Repositories on Server.')
.parse(process.argv);
function listProjects() {
scmStash.getProjectListing(function (data) {
for (var i = 0; i < data.size; i++) {
var project = data.values[i];
console.log(' ' + i + ' ' + project.name + ' @ ' + project.link.url);
}
})
}
if (program.Projects) {
console.log(' - Projects');
listProjects();
}
我一直在WebStorm中构建它,当我使用node.js调用该命令时,运行一切都非常完美。例如,如果我运行WebStorm运行程序执行/strack-P命令输出项目,输出如下。。。
node strack -P
- Projects
0 Business Insights @ /projects/BI
1 Platform @ /projects/HDP
2 H @ /projects/H
3 QC Application Code @ /projects/QCCODE
4 QC Design @ /projects/QCDESIGN
5 QC Reports @ /projects/QCREP
6 Sandbox @ /projects/SAN
7 Systemic Automation Tools @ /projects/SAT
8 The Swamp @ /projects/SWAMP
然而,当我从标准bash(在iTerm中的WebStorm内部或WebStorm外部)运行相同的"strack"命令时,将显示以下输出。
23:11 $ node strack -P
- Projects
当我写下这个问题时,我意识到了这个难题——就像在打堆叠式问题时经常发生的那样。打印出项目本身的另一个调用是异步调用,实际的应用程序启动该调用,然后执行剩余的代码行并完成。甚至在项目返回并可以打印到控制台之前。我不确定WebStorm在做什么来保持控制台连接到运行的进程,但我很想让它为我的CLI工作。关于我应该如何重新设计这个应用程序以将项目打印到命令行,有什么想法、想法或建议吗?
所有代码都可以在这里的github repo上获得。
我认为问题在于while循环中的数组边界。data.size
可能是你从其他8种语言中记住的东西,哈哈。但它不在js中,你正在寻找data.length。试试这个,它被修剪了,并有一个scmStash对象的mock,但我想你会明白我的意思:
var command, listProjects, program, scmStash;
program = require('commander');
scmStash = {
getRepositories: function(cb) {
return cb([
{
name: 'a',
cloneUrl: 'b'
}, {
name: 'c',
cloneUrl: 'd'
}
]);
},
getProjectListing: function(cb) {
return cb([
{
name: "proj1",
link: {
url: "http://blah"
}
}, {
name: "proj2",
link: {
url: "http://bluh"
}
}
]);
}
};
command = {};
listProjects = function() {
return scmStash.getProjectListing(function(projects) {
var i, j, len, project, results;
results = [];
for (i = j = 0, len = projects.length; j < len; i = ++j) {
project = projects[i];
results.push(console.log(' ' + i + ' ' + project.name + ' @ ' + project.link.url));
}
return results;
});
};
输出:
$ node .temp/adron.js -P
- Projects
0 proj1 @ http://blah
1 proj2 @ http://bluh
此外,还需要进行优化,在迭代之前将数组的长度存储在变量中,但这非常小。当一个数组中有一百万个元素时,请担心这一点。
ES7建议使用异步/等待语法。
同时,还有大量的流量控制软件包可供选择。您可以考虑"async"NPM包。
相关文章:
- esri javascript异步打印
- JavaScript异步问题
- $translateProvider.useStaticFilesLoader的Angular Translate异步定
- 异步facebook功能
- 异步并行错误
- 在继续之前,请确保异步GET/POST请求已完成
- QUnit 异步测试在出错后不会继续
- 使用节点时是否有等效的语句“继续”.js 为每个系列异步
- 如何为性能执行多个异步函数(非嵌套),但等待它们完成再继续
- 如何在继续之前构建这些嵌套的异步请求以完成批处理
- 如何在repl/bash w/Node.js Commander中继续接收异步console.log消息
- 只有当异步获取请求完成时,才能继续循环
- 如何让Javascript在继续之前等待异步调用
- 等待异步函数完成后再继续
- 让Angular-JS在继续之前等待异步调用有问题
- 在异步闭包中设置变量后,确保在继续之前设置变量
- NodeJS承诺,递归,异步继续
- JavaScript(异步)如何决定哪些东西需要“等待”?在继续之前
- 等待异步任务完成后再继续
- Node.js等待直到异步函数完成,然后继续执行其余的代码