试图串行运行命令

时间:2017-12-29 17:41:46

标签: javascript node.js sockets websocket async.js

我正在尝试在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秒,因此进度条的进度不可能是线性的。

1 个答案:

答案 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