如何继续在repl / bash w / Node.js Commander中接收asynchronousconsole.log消息?

我有一个Node.js CLI,我一直在使用Commander库来构build。 这是主执行文件的代码。

#!/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中build立这个,当我使用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(在WebStorm内部或在iTerm等WebStorm之外)运行相同的“strack”命令时,将显示以下输出。

 23:11 $ node strack -P - Projects 

正如我写这个问题,我 – 就像经常发生在input一个计算器的问题时 – 发现了dillemma。 另一个打印项目本身的调用是一个asynchronous调用,实际的应用程序发射掉那个调用,然后执行剩下的代码行并结束。 在项目甚至返回之前,可以打印到控制台。 我不确定WebStorm是如何将控制台连接到正在运行的进程的,但是我很想为我的CLI做这个工作。 任何关于如何重新devise这个应用程序来实际打印项目到命令行的想法,想法或build议?

所有的代码都可以在这里的github回购 。

我认为这个问题是在你的while循环中的数组边界。 data.size可能是你记得从其他8种语言之一,你知道,哈哈。 但它不是在JS,你正在寻找data.length。 试试这个,它被修剪下来,有一个模拟scmStash对象,但我想你会明白我的意思:

 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 

另外, 在迭代之前 ,将数组的长度存储在一个variables中有一个优化, 但是它是非常小的 。 担心在数组中有一百万个元素。

ES7build议使用async / await语法。

同时,有大量的stream量控制软件包可用。 你可能会考虑“asynchronous”NPM包 。