Node.js:迭代二进制数组中的哪个命令

时间:2016-05-20 18:03:19

标签: javascript node.js coffeescript atom-editor

我的Atom软件包在系统的默认文件管理器中打开一个文件。在Linux上,我有一系列广泛使用的文件管理器,我想迭代运行which命令并返回路径。

我当前脚本的问题是,我不知道如何打破迭代。运行此代码将记录所有which次尝试,并将生成每个可用选项。显然,这不是迭代的目的。

CoffeeScript (下面的JavaScript):

fileManagers: ['xdg-open', 'gnome-open', 'kde-open', 'nautilus', 'dolphin']    

@loopWhich (result) ->
  console.log "Result: #{result}"    

loopWhich: (callback) ->
    {exec} = require('child_process')

    for fm in @fileManagers    

      console.log "which: #{fm}"    

      exec "which #{fm}", (error, stdout, stderr) ->
        if error is null
          callback stdout

JavaScript (由coffee-script@1.9.2自动生成):

({
  fileManagers: ['xdg-open', 'gnome-open', 'kde-open', 'nautilus', 'dolphin']
});    

this.loopWhich(function(result) {
  return console.log("Result: " + result);
});    

({
  loopWhich: function(callback) {
    var exec, fm, i, len, ref, results;
    exec = require('child_process').exec;
    ref = this.fileManagers;
    results = [];
    for (i = 0, len = ref.length; i < len; i++) {
      fm = ref[i];
      console.log("which: " + fm);
      results.push(exec("which " + fm, function(error, stdout, stderr) {
        if (error === null) {
          return callback(stdout);
        }
      }));
    }
    return results;
  }
});

1 个答案:

答案 0 :(得分:0)

由于异步方面很难,但我认为这应该有效:

{exec} = require 'child_process'

promisify = (name, fn, args...) ->
  return new Promise (resolve, reject) ->
    cb = (err) -> if err then reject err else resolve name
    fn.apply null, args.concat(cb)

thenHandler = (name) -> console.log name

fileManagers.forEach (filem) -> promisify(filem, exec, "which #{filem}").then thenHandler

将忽略错误情况,并且成功执行应该登录到控制台。如果你想要实际的成功,你必须将所有的Promise包装在另一个Promise中,并使用不同的.then处理程序来解决带有正确结果的总体承诺:

fileManager = new Promise (resolve, reject) ->
  fileManagers.forEach (filem) ->
    promisify(filem, exec, "which #{filem}").then (name) -> resolve name

如果多次尝试成功,则只会解决第一次尝试。