我如何在下面实现?
服务器端:
执行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);
}
});
答案 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
上的更多信息