Redian新闻
>
node.js child process: 怎样保证1个命令执行完了再执行下一个?
avatar
node.js child process: 怎样保证1个命令执行完了再执行下一个?# Programming - 葵花宝典
c*d
1
8个人刚出发,下大雨接一个法国小女孩,被德军狙击手打成重伤,别人不敢去救,最
后挂掉,直到狙击手被干掉
avatar
w*s
2
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)
上班一天很累啦,求大牛们直接告诉答案。谢谢!
avatar
l*p
3
为啥不直接火力压制,十几个人射箭,那人哪有机会一直瞄着
如果怕没箭了一会儿再捡回来不就行了

【在 c****d 的大作中提到】
: 8个人刚出发,下大雨接一个法国小女孩,被德军狙击手打成重伤,别人不敢去救,最
: 后挂掉,直到狙击手被干掉

avatar
c*e
4
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)
: 上班一天很累啦,求大牛们直接告诉答案。谢谢!

avatar
i*i
5
后面还有给老婆洗脚的情节,跟《楚汉风云》的刘邦吕雉那一出儿一样一样滴。。。。
这个狗子死的一点不让人同情。开始就让他别去走远,他专门找个空旷高地站在那儿当
靶子。后面中箭后,无数人在旁边对他喊趴下趴下,他就非要一直挺着站起来。又中箭
之后还不老实趴着,让他别动等着,他愣是充耳不闻非要爬啊爬啊然后一直拼命喊救命
。简直就是悲催的。而且岳飞不是号称治军以严、临战以勇吗?怎么部下根本不听号令
呢?实在是不怕神一样的敌手,就怕猪一样的队友。。。。
avatar
j*a
6
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)
: 上班一天很累啦,求大牛们直接告诉答案。谢谢!

avatar
l*p
7
编剧比较煞笔
趴那里装死不行啊

【在 i***i 的大作中提到】
: 后面还有给老婆洗脚的情节,跟《楚汉风云》的刘邦吕雉那一出儿一样一样滴。。。。
: 这个狗子死的一点不让人同情。开始就让他别去走远,他专门找个空旷高地站在那儿当
: 靶子。后面中箭后,无数人在旁边对他喊趴下趴下,他就非要一直挺着站起来。又中箭
: 之后还不老实趴着,让他别动等着,他愣是充耳不闻非要爬啊爬啊然后一直拼命喊救命
: 。简直就是悲催的。而且岳飞不是号称治军以严、临战以勇吗?怎么部下根本不听号令
: 呢?实在是不怕神一样的敌手,就怕猪一样的队友。。。。

avatar
c*d
9
所以说和大兵很象啊。大兵里miller上尉不让他去接那个小女孩,他非要去接。被德军
狙击手打中以后也是爬啊爬,多爬几步就要暴露自己狙击手的位置了。

【在 i***i 的大作中提到】
: 后面还有给老婆洗脚的情节,跟《楚汉风云》的刘邦吕雉那一出儿一样一样滴。。。。
: 这个狗子死的一点不让人同情。开始就让他别去走远,他专门找个空旷高地站在那儿当
: 靶子。后面中箭后,无数人在旁边对他喊趴下趴下,他就非要一直挺着站起来。又中箭
: 之后还不老实趴着,让他别动等着,他愣是充耳不闻非要爬啊爬啊然后一直拼命喊救命
: 。简直就是悲催的。而且岳飞不是号称治军以严、临战以勇吗?怎么部下根本不听号令
: 呢?实在是不怕神一样的敌手,就怕猪一样的队友。。。。

avatar
z*e
10
恭喜你,朝着callback hell迈出了坚实的一步
avatar
w*s
11
那你有啥高招?

【在 z****e 的大作中提到】
: 恭喜你,朝着callback hell迈出了坚实的一步
avatar
T*r
12
难道是async?

【在 w*s 的大作中提到】
: 那你有啥高招?
avatar
n*t
15
async waterfall

【在 w*s 的大作中提到】
: 如果bash里是3个cmd, 这就得2层callback了吧?
: 算了,我还是把它放python里,让node直接call python ...

avatar
z*e
16

对的,异步的一个害处就是在同步看来先后顺序很清晰简单的编码
到了异步的时候,为了non-block,就会变得很蛋疼,所以需要worker
worker就是同步的,就类似你这里的python,大多数python代码都是同步的

【在 w*s 的大作中提到】
: 如果bash里是3个cmd, 这就得2层callback了吧?
: 算了,我还是把它放python里,让node直接call python ...

avatar
B*g
17
// ================================================
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)
: 上班一天很累啦,求大牛们直接告诉答案。谢谢!

avatar
w*s
18
谢谢各位兄弟。
我有个傻问题,这情况为什么要用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;
: });

avatar
p*2
19

用个循环也行吧?

【在 w*s 的大作中提到】
: 如果bash里是3个cmd, 这就得2层callback了吧?
: 算了,我还是把它放python里,让node直接call python ...

avatar
B*g
20
errr。。。。不清楚你的问题
这要看你的command是啥。如果是一般的bash command,比如grep,或者ffmpeg,
imagemagick,你直接用node就可以了吧。
async的好处是可以很清楚排列你的tasks的先后顺序,不会有callback hell。比如你
要打开100个文件,你就可以把这文件的path放在一个array里,然后用async.map
如果你是要调用python function,当然要用python

【在 w*s 的大作中提到】
: 谢谢各位兄弟。
: 我有个傻问题,这情况为什么要用async,为什么不直接调python ?

avatar
w*s
21
我的2个command:
stop service
start service
放循环能确保stop service完全结束再start service吗?不是很熟悉node的技巧的

【在 p*****2 的大作中提到】
:
: 用个循环也行吧?

avatar
w*s
22
我觉得全放python里,直接从node调最简单,不知道理解对不对

【在 B****g 的大作中提到】
: errr。。。。不清楚你的问题
: 这要看你的command是啥。如果是一般的bash command,比如grep,或者ffmpeg,
: imagemagick,你直接用node就可以了吧。
: async的好处是可以很清楚排列你的tasks的先后顺序,不会有callback hell。比如你
: 要打开100个文件,你就可以把这文件的path放在一个array里,然后用async.map
: 如果你是要调用python function,当然要用python

avatar
p*2
23
两个你做个restartservice函数就行了
callback并不可怕

【在 w*s 的大作中提到】
: 我的2个command:
: stop service
: start service
: 放循环能确保stop service完全结束再start service吗?不是很熟悉node的技巧的

avatar
k*i
24
require!
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)
: 上班一天很累啦,求大牛们直接告诉答案。谢谢!

avatar
ET
25
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)
: 上班一天很累啦,求大牛们直接告诉答案。谢谢!

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。