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

Adr*_*ron 7 javascript bash asynchronous command-line-interface node.js

我有一个Node.js CLI,我一直在使用Commander Library 构建.这是主执行文件中的代码.

#!/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();
}
Run Code Online (Sandbox Code Playgroud)

我一直在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
Run Code Online (Sandbox Code Playgroud)

但是,当我从标准bash(在WebStorm内部或在iTerm中的WebStorm之外)运行相同的'strack'命令时,则显示以下输出.

23:11 $ node strack -P
  - Projects
Run Code Online (Sandbox Code Playgroud)

当我写下这个问题时,我 - 就像在输入stackoverflow问题时经常发生的那样 - 实现了这个问题.打印出项目本身的另一个调用是异步调用,实际的应用程序会触发该调用,然后执行剩余的代码行并完成.在项目甚至返回之前,可以打印到控制台.我不确定WebStorm正在做什么来保持控制台与正在运行的进程相关联,但我很乐意为我的CLI工作.关于如何重新设计此应用程序以实际将项目打印到命令行的任何想法,想法或建议?

所有代码都可以在github repo上找到.

jco*_*lum 2

我认为问题出在 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;
  });
};
Run Code Online (Sandbox Code Playgroud)

输出:

$ node .temp/adron.js -P
  - Projects
    0 proj1 @ http://blah
    1 proj2 @ http://bluh
Run Code Online (Sandbox Code Playgroud)

此外,通过在迭代之前将数组的长度存储在变量中可以进行优化,但它非常小。当数组中有一百万个元素时,请担心这一点。