Node.js: 在二进制数组上迭代 which 命令
Node.js: Iterating which command over an array of binaries
我的一个 Atom 包在系统的默认文件管理器中打开一个文件。在 Linux 上,我有一系列广泛使用的文件管理器,我想遍历 运行 which
命令和 return 路径。
我当前脚本的问题是,我不知道如何中断迭代。 运行 此代码将记录所有 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;
}
});
由于异步方面,它很难,但我认为这应该可行:
{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
如果多次尝试成功,则只会解决第一个问题。
我的一个 Atom 包在系统的默认文件管理器中打开一个文件。在 Linux 上,我有一系列广泛使用的文件管理器,我想遍历 运行 which
命令和 return 路径。
我当前脚本的问题是,我不知道如何中断迭代。 运行 此代码将记录所有 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;
}
});
由于异步方面,它很难,但我认为这应该可行:
{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
如果多次尝试成功,则只会解决第一个问题。