RNA
RNA

Reputation: 1091

Promise chaining + return variable with meteor callback

How can I achieve below?

server side:

execute bash commands to generate files. then return the path of file D

const exec = Meteor.isServer ? require('child_process').exec : undefined;

Meteor.methods({
  createFile_D(){
    const BashCommand_A = `generate file A`;
    const BashCommand_B = `generate file B, using file A`;
    const BashCommand_C = `generate file C, using file B`;
    const BashCommand_D = `generate file D, using file C`;

    const runCommand = function (cmd) {
      let command = exec(cmd, path);
      command.stdout.on('data', (data) => {
        console.log(`stdout: ${data}`);
      });
      command.stderr.on('data', (data) => {
        console.log(`stderr: ${data}`);
      });
      command.on('close', (code) => {
        console.log(`child process exited with code ${code}`);
        resolve('done');
      })
    }

    // execute BashCommand A ~ D
    // when it's all done return the path of file D

  } 
});

client side:

retrieve path of generated file D as a callback of Meteor.call

Meteor.call('createFile_D', function (error, result) {
  if(error || (result === undefined)) {
    throw error;
  } else {
    do_something_with_result (result);
  }
});

Upvotes: 0

Views: 41

Answers (1)

dr.dimitru
dr.dimitru

Reputation: 2702

Use Meteor.wrapAsync or Async/Await:

const runCommand = (cmd) => {
  return new Promise((resolve, reject) => {
    // Make sure `path` variable is exists
    let command = exec(cmd, path);
    command.stdout.on('data', (data) => {
      console.log(`stdout: ${data}`);
    });
    command.stderr.on('data', (data) => {
      console.log(`stderr: ${data}`);
    });
    command.on('close', (code) => {
      console.log(`child process exited with code ${code}`);
      resolve(path);
    })
  });
};

Meteor.methods({
  async createFile_D(){
    const BashCommand_A = `generate file A`;
    const BashCommand_B = `generate file B, using file A`;
    const BashCommand_C = `generate file C, using file B`;
    const BashCommand_D = `generate file D, using file C`;


    await runCommand(BashCommand_A);
    await runCommand(BashCommand_B);
    await runCommand(BashCommand_C);
    const path_D = await runCommand(BashCommand_D);

    // path_D from resolve() in Promise
    return path_D;
  } 
});

Read more info on await / async

Upvotes: 1

Related Questions