【问题标题】:How to init array of commands only when the each is finished?如何仅在每个命令完成时才初始化命令数组?
【发布时间】:2021-12-31 09:18:05
【问题描述】:

我是 JavaScript 和编码的新手,所以无法在线找到答案。我想创建一个 Node CLI 命令来执行一堆命令,一个接一个,但前提是前一个完成:

#! /usr/bin/env node
let child_process = require('child_process')
let exe;
const commands = [
      {
         title: `Creating React App`,
         path: `npx create-react-app .`
      },
      {
         title: `Gitting`,
         path: `git init`
      }
   ];
commands.forEach(command => {
            exe = child_process.exec(`${command.path}`, {cwd: `.`});
            exe.stdout.pipe(process.stdout)
            exe.on('exit', function() {
               // now next
              process.exit()
            })
         });

我该如何等待“退出”?

谢谢!

【问题讨论】:

    标签: node.js loops recursion command-line-interface child-process


    【解决方案1】:

    使用 promises 和 async/await,在上一个命令完成后运行每个命令。

    所以,创建一个运行命令的函数,等待它完成,然后运行下一个。设置命令计数器以跟踪所有命令何时完成。

    代码如下:

    #! /usr/bin/env node
    let child_process = require('child_process')
    
    const commands = [{
       title: `Creating React App`,
       path: `npx create-react-app .`
    }, {
       title: `Gitting`,
       path: `git init`
    }];
    
    
    // command runner
    const runCommand = (command) => {
    
       return new Promise((resolve, reject) => {
    
          let exe = child_process.exec(`${command.path}`, {
             cwd: `.`
          });
          exe.stdout.pipe(process.stdout)
          exe.on('exit', function() {
             console.log('finished: ', command.title);
             // now next
             resolve();
          })
       });
    };
    
    
    // run command in series
    (async() => {
    
       // setup commands counter
       let i = 0;
    
       for (const command of commands) {
    
          console.log('running', command.title);
    
          // wait for command to finish
          let done = await runCommand(command);
    
          // log done command
          i++;
    
          // check if all commands are done
          if (i === commands.length) {
             console.log('done');
             process.exit();
          }
       }
    })();
    

    【讨论】:

      猜你喜欢
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多