回调异常[TypeError:listener必须是函数]

时间:2015-05-20 10:26:47

标签: javascript node.js callback child-process

我编写了一个简单的NodeJS程序来执行shell脚本。我掏出一个孩子并尝试执行该脚本。我在退出时向孩子提供了一个回调,如下所示。但是当我尝试运行程序时它会抛出异常。我哪里错了?

var exec = require('child_process').exec;

function callXmlAgent(callback) {
    try {
        var child = exec('./a.sh');
        var response = { stdout: '', stderr: '', errCode: -1 };

        child.stdout.on('data', function (data) {
            response.stdout += data;
        });

        child.stderr.on('data', function (data) {
            response.stderr += data;
        });

        child.on('close', function (errCode) {
            if (errCode) {
                response.errCode = errCode;
            }
        });

        child.on('exit', callback(response));

        process.on('exit', function () {
            // If by chance the parent exits, the child is killed instantly
            child.kill();
        });
    } catch(exception) {
        console.log(exception);
    }
}

function foo(response) {
    console.log(response)
};

callXmlAgent(foo);

我得到的输出是:

{ stdout: '', stderr: '', errCode: -1 }
[TypeError: listener must be a function]

1 个答案:

答案 0 :(得分:7)

使用以下代码修改子退出事件:

child.on('exit', function() {
   callback(response);
});

现在它不再抛出错误,但要注意使用异步数据并不能保证执行顺序,因此可能会产生意外结果。

问题是你无法在另一个函数中传递带参数的函数。您必须创建一个匿名函数并在其中发送参数。