Javascript Node.js:在二进制文件数组上迭代哪个命令

Javascript Node.js:在二进制文件数组上迭代哪个命令,javascript,node.js,coffeescript,atom-editor,Javascript,Node.js,Coffeescript,Atom Editor,我的一个Atom包在系统的默认文件管理器中打开一个文件。在Linux上,我有一系列广泛使用的文件管理器,我希望通过运行which命令迭代这些文件管理器并返回路径 我当前脚本的问题是,我不知道如何中断迭代。运行此代码将记录所有尝试的,并将产生所有可用选项。显然,这不是迭代的目的 咖啡脚本(JavaScript如下): JavaScript(由自动生成)-script@1.9.2): ({ 文件管理器:['xdg-open','gnome open','kde open','nautilus','d

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

我当前脚本的问题是,我不知道如何中断迭代。运行此代码将记录所有尝试的
,并将产生所有可用选项。显然,这不是迭代的目的

咖啡脚本(JavaScript如下):

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

({
文件管理器:['xdg-open','gnome open','kde open','nautilus','dolphin']
});    
this.loopWhich(函数(结果){
返回console.log(“结果:+Result”);
});    
({
loopWhich:函数(回调){
var exec、fm、i、len、ref、结果;
exec=要求(“子进程”)。exec;
ref=this.fileManagers;
结果=[];
对于(i=0,len=ref.length;i
由于异步方面的原因,这很困难,但我认为这应该可以:

{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
错误案例将被忽略,成功的执行应记录到控制台。如果您想要真正成功的承诺,您必须将所有承诺包装在另一个承诺中,并使用不同的
。然后
处理程序以正确的结果解决过度承诺:

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

如果不止一次尝试成功,它将只使用第一次解决。

由于异步方面的原因,这很困难,但我认为这应该是可行的:

{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
错误案例将被忽略,成功的执行应记录到控制台。如果您想要真正成功的承诺,您必须将所有承诺包装在另一个承诺中,并使用不同的
。然后
处理程序以正确的结果解决过度承诺:

fileManager = new Promise (resolve, reject) ->
  fileManagers.forEach (filem) ->
    promisify(filem, exec, "which #{filem}").then (name) -> resolve name
如果不止一次尝试成功,它将仅使用第一次解决