我正在尝试在Node中运行一些shell命令 WHILE 将一些信息发送回客户端。
为此,我使用了 Socket.IO 和 Async.JS 的组合。
我来自Python,每个命令都可以一个接一个地完美运行。根据我的理解,Node同时运行所有内容,这很棒,但有时我们需要一个接一个地运行一些东西。
这是我的服务器端代码:
io.on('connection', function(client) {
client.on('convertstart', function(data) {
async.series([
function (next) {
console.log('# STARTING -> room ' + room_);
client.join(data.room);
next(null, '');
},
function (next) {
io.to(data.room).emit('step0');
next(null, '');
},
function (next) {
var some_commands = require('child_process').execSync('some bash commands');
next(null, '');
},
function (next) {
io.to(data.room).emit('step1');
next(null, '');
},
function (next) {
var some_commands = require('child_process').execSync('some other bash commands');
next(null, '');
}
],
function (err, result) {
console.log(result);
});
});
});
这是我的客户端代码:
socket.on('step0', function(data){
for(var i = 0; i < 10; i++) {
(function(i){
setTimeout(function(){
$(".uk-progress").css('width', i + '%');
$(".uk-progress").text(i + '%');
}, 300 * i)
})(i);
}
});
socket.on('step1', function(data){
for(var i = 10; i < 30; i++) {
(function(i){
setTimeout(function(){
$(".uk-progress").css('width', i + '%');
$(".uk-progress").text(i + '%');
}, 300 * i)
})(i);
}
});
想法是将进度条从0%移动到10%(使用Socket.IO),然后执行一些命令行操作,然后将进度条从10%移动到30%(再次使用Socket.IO) ,然后再做一些命令行操作等等。
目前,此代码只运行整个内容,而不会在每个操作之间停止。我想要注意,每个命令行命令需要5到10秒,因此进度条的进度不可能是线性的。
答案 0 :(得分:0)
乍一看......问题似乎与next()
与其需要等待的命令同步使用这一事实有关......但我相信它实际上应该作为您需要运行的命令的成功回调函数。
所以:
function (next) {
console.log('# STARTING -> room ' + room_);
client.join(data.room);
next(null, '');
},
实际上是:
function (next) {
console.log('# STARTING -> room ' + room_);
// Use next as the callback once client joins.
client.join(data.room, next); // use next.bind(null, '') if needed.
},
以及每个步骤等等。
我认为,Emit回调是第二个或第三个选项,因此:.emit('step1', next)
或.emit('step1',null,next)
应该这样做。
https://socket.io/docs/#sending-and-getting-data-(acknowledgements)
您将不得不切换到异步子进程执行以使用回调,这是您想要的,因此:.exec('some bash commands', next)
https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback