javascript - 如何将函数/回调传递给 Node.js 中的子进程?

标签 javascript node.js child-process

假设我有一个 parent.js 包含一个名为 parent 的方法

var childProcess = require('child_process');

var options = {
    someData: {a:1, b:2, c:3},
    asyncFn: function (data, callback) { /*do other async stuff here*/ }
};

function Parent(options, callback) {
    var child = childProcess.fork('./child');
    child.send({
        method: method,
        options: options
    });
    child.on('message', function(data){
        callback(data,err, data,result);
        child.kill();
    });
}

同时在 child.js

process.on('message', function(data){
    var method = data.method;
    var options = data.options;
    var someData = options.someData;
    var asyncFn = options.asyncFn; // asyncFn is undefined at here
    asyncFn(someData, function(err, result){
        process.send({
            err: err,
            result: result
        });
    });
});

我想知道在 Node.js 中是否不允许将函数传递给子进程。

为什么 asyncFn 发送给 child 后会变成 undefined

JSON.stringify有关系吗?

最佳答案

JSON 不支持序列化函数(至少开箱即用)。您可以先将该函数转换为其字符串表示形式(通过 asyncFn.toString()),然后在子进程中再次重新创建该函数。但问题是你失去了这个过程的范围和上下文,所以你的函数真的必须是独立的。

完整示例:

parent.js:

var childProcess = require('child_process');

var options = {
  someData: {a:1, b:2, c:3},
  asyncFn: function (data, callback) { /*do other async stuff here*/ }
};
options.asyncFn = options.asyncFn.toString();

function Parent(options, callback) {
  var child = childProcess.fork('./child');
  child.send({
    method: method,
    options: options
  });
  child.on('message', function(data){
    callback(data,err, data,result);
    child.kill();
  });
}

child.js:

process.on('message', function(data){
  var method = data.method;
  var options = data.options;
  var someData = options.someData;
  var asyncFn = new Function('return ' + options.asyncFn)();
  asyncFn(someData, function(err, result){
    process.send({
      err: err,
      result: result
    });
  });
});

关于javascript - 如何将函数/回调传递给 Node.js 中的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28037647/

相关文章:

javascript history.pushState 不适用于 iframe

javascript - form.submit() 不起作用

node.js - 如何查看ubuntu screen Node 命令日志

javascript - node.js 调用外部 exe 并等待输出

javascript - context.drawImage 是如何工作的

javascript - 如何清除 Nx 缓存

javascript - 处理竞争条件 : Passport SignUp function works but responds with 404 Error

node.js - 将运行时参数传递给 Nodejs 子进程

javascript - 如何在Electron中触发node filename.js文件?

bash - 无法在后台 shell 中捕获 SIGINT 信号