w*s 发帖数: 7227 | 1 var spawn = require('child_process').spawn;
// exec 2 commands 1 by 1
var child1 = spawn('cmd1', ['argu1']);
var child2 = spawn('cmd2', ['argu2']);
怎样保证cmd1执行完毕了再执行cmd2 ?
(如果是shell我就这么写,
/home/wds# cmd1 argu1; cmd2 argu2)
上班一天很累啦,求大牛们直接告诉答案。谢谢! |
c*********e 发帖数: 16335 | 2 callback
【在 w*s 的大作中提到】 : var spawn = require('child_process').spawn; : // exec 2 commands 1 by 1 : var child1 = spawn('cmd1', ['argu1']); : var child2 = spawn('cmd2', ['argu2']); : 怎样保证cmd1执行完毕了再执行cmd2 ? : (如果是shell我就这么写, : /home/wds# cmd1 argu1; cmd2 argu2) : 上班一天很累啦,求大牛们直接告诉答案。谢谢!
|
j*a 发帖数: 14423 | 3 https://nodejs.org/api/child_process.html#child_process_child_process_exec_
command_options_callback
【在 w*s 的大作中提到】 : var spawn = require('child_process').spawn; : // exec 2 commands 1 by 1 : var child1 = spawn('cmd1', ['argu1']); : var child2 = spawn('cmd2', ['argu2']); : 怎样保证cmd1执行完毕了再执行cmd2 ? : (如果是shell我就这么写, : /home/wds# cmd1 argu1; cmd2 argu2) : 上班一天很累啦,求大牛们直接告诉答案。谢谢!
|
w*s 发帖数: 7227 | |
z****e 发帖数: 54598 | 5 恭喜你,朝着callback hell迈出了坚实的一步 |
w*s 发帖数: 7227 | 6 那你有啥高招?
【在 z****e 的大作中提到】 : 恭喜你,朝着callback hell迈出了坚实的一步
|
T**r 发帖数: 7016 | 7 难道是async?
【在 w*s 的大作中提到】 : 那你有啥高招?
|
l**********n 发帖数: 8443 | |
w*s 发帖数: 7227 | 9 如果bash里是3个cmd, 这就得2层callback了吧?
算了,我还是把它放python里,让node直接call python ...
【在 j*a 的大作中提到】 : https://nodejs.org/api/child_process.html#child_process_child_process_exec_ : command_options_callback
|
n*****t 发帖数: 22014 | 10 async waterfall
【在 w*s 的大作中提到】 : 如果bash里是3个cmd, 这就得2层callback了吧? : 算了,我还是把它放python里,让node直接call python ...
|
|
|
z****e 发帖数: 54598 | 11
对的,异步的一个害处就是在同步看来先后顺序很清晰简单的编码
到了异步的时候,为了non-block,就会变得很蛋疼,所以需要worker
worker就是同步的,就类似你这里的python,大多数python代码都是同步的
【在 w*s 的大作中提到】 : 如果bash里是3个cmd, 这就得2层callback了吧? : 算了,我还是把它放python里,让node直接call python ...
|
B****g 发帖数: 83 | 12 // ================================================
var spawn = require('child_process').spawn;
var async = require('async');
function spawnFunc(options, cb) {
var child = spawn(options.cmd, options.args, function);
var result = '';
child.stdout.on('data', function (data) {
// do some stuff with stdout data
result += data;
});
child.stderr.on('data', function (data) {
// do some stuff with stderr data
});
child.on('close', function (code) {
// error
if (code !== 0) {
cb('ps process exited with code ' + code);
return;
}
// success
cb(null, result);
});
}
function run() {
var commands = [{
cmd: 'cmd1',
args: ['args1']
}, {
cmd: 'cmd2',
args: ['args2']
}];
async.mapSeries(commands, spawnFunc, function (err, results) {
if (err) {
throw err;
}
// handler results
});
}
run();
// ================================================
Or you can use async.series, async.waterfall
Another option is to use defer chain with bluebird or Q
PS: If you only need to get the final stdout, and don't need to read every
line of the stdout, exec might be a better option than spawn
【在 w*s 的大作中提到】 : var spawn = require('child_process').spawn; : // exec 2 commands 1 by 1 : var child1 = spawn('cmd1', ['argu1']); : var child2 = spawn('cmd2', ['argu2']); : 怎样保证cmd1执行完毕了再执行cmd2 ? : (如果是shell我就这么写, : /home/wds# cmd1 argu1; cmd2 argu2) : 上班一天很累啦,求大牛们直接告诉答案。谢谢!
|
w*s 发帖数: 7227 | 13 谢谢各位兄弟。
我有个傻问题,这情况为什么要用async,为什么不直接调python ?
【在 B****g 的大作中提到】 : // ================================================ : var spawn = require('child_process').spawn; : var async = require('async'); : function spawnFunc(options, cb) { : var child = spawn(options.cmd, options.args, function); : var result = ''; : child.stdout.on('data', function (data) { : // do some stuff with stdout data : result += data; : });
|
p*****2 发帖数: 21240 | 14
用个循环也行吧?
【在 w*s 的大作中提到】 : 如果bash里是3个cmd, 这就得2层callback了吧? : 算了,我还是把它放python里,让node直接call python ...
|
B****g 发帖数: 83 | 15 errr。。。。不清楚你的问题
这要看你的command是啥。如果是一般的bash command,比如grep,或者ffmpeg,
imagemagick,你直接用node就可以了吧。
async的好处是可以很清楚排列你的tasks的先后顺序,不会有callback hell。比如你
要打开100个文件,你就可以把这文件的path放在一个array里,然后用async.map
如果你是要调用python function,当然要用python
【在 w*s 的大作中提到】 : 谢谢各位兄弟。 : 我有个傻问题,这情况为什么要用async,为什么不直接调python ?
|
w*s 发帖数: 7227 | 16 我的2个command:
stop service
start service
放循环能确保stop service完全结束再start service吗?不是很熟悉node的技巧的
【在 p*****2 的大作中提到】 : : 用个循环也行吧?
|
w*s 发帖数: 7227 | 17 我觉得全放python里,直接从node调最简单,不知道理解对不对
【在 B****g 的大作中提到】 : errr。。。。不清楚你的问题 : 这要看你的command是啥。如果是一般的bash command,比如grep,或者ffmpeg, : imagemagick,你直接用node就可以了吧。 : async的好处是可以很清楚排列你的tasks的先后顺序,不会有callback hell。比如你 : 要打开100个文件,你就可以把这文件的path放在一个array里,然后用async.map : 如果你是要调用python function,当然要用python
|
p*****2 发帖数: 21240 | 18 两个你做个restartservice函数就行了
callback并不可怕
【在 w*s 的大作中提到】 : 我的2个command: : stop service : start service : 放循环能确保stop service完全结束再start service吗?不是很熟悉node的技巧的
|
k****i 发帖数: 101 | 19 require! <[ child_process deasync ]>
exec-sync = deasync child_process.exec
exec-sync 'sleep 5'
console.log 'time up'
【在 w*s 的大作中提到】 : var spawn = require('child_process').spawn; : // exec 2 commands 1 by 1 : var child1 = spawn('cmd1', ['argu1']); : var child2 = spawn('cmd2', ['argu2']); : 怎样保证cmd1执行完毕了再执行cmd2 ? : (如果是shell我就这么写, : /home/wds# cmd1 argu1; cmd2 argu2) : 上班一天很累啦,求大牛们直接告诉答案。谢谢!
|
ET 发帖数: 10701 | 20 promise
【在 w*s 的大作中提到】 : var spawn = require('child_process').spawn; : // exec 2 commands 1 by 1 : var child1 = spawn('cmd1', ['argu1']); : var child2 = spawn('cmd2', ['argu2']); : 怎样保证cmd1执行完毕了再执行cmd2 ? : (如果是shell我就这么写, : /home/wds# cmd1 argu1; cmd2 argu2) : 上班一天很累啦,求大牛们直接告诉答案。谢谢!
|