通过流星回调承诺链接+返回变量

时间:2017-06-22 06:19:45

标签: javascript meteor promise

我如何在下面实现?

服务器端:

执行bash命令生成文件。然后返回文件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

  } 
});

客户方:

检索生成的文件D的路径作为Meteor.call的回调

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

1 个答案:

答案 0 :(得分:1)

使用Meteor.wrapAsync或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;
  } 
});

阅读await / async

上的更多信息