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

How to continue receiving asynchronous console.log messages in repl/bash w/ Node.js Commander?

本文关键字:继续 异步 log console 消息 js repl bash Node Commander      更新时间:2023-09-26

我有一个使用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包。