Javascript 将日志函数传递给Promise

Javascript 将日志函数传递给Promise,javascript,es6-promise,Javascript,Es6 Promise,对于节点库,我希望能够将日志函数传递给返回承诺的函数。默认情况下,记录器将是console.log,但可能会被其他内容替换,具体取决于用例 // define custom logger const opts = { log: console.log, error: console.error }; const spawnPromise = (cmd, args, opts) => { return new Promise((resolve, reject) =>

对于节点库,我希望能够将日志函数传递给返回承诺的函数。默认情况下,记录器将是
console.log
,但可能会被其他内容替换,具体取决于用例

// define custom logger
const opts = {
    log: console.log,
    error: console.error
};

const spawnPromise = (cmd, args, opts) => {
  return new Promise((resolve, reject) => {
    const child = spawn(cmd, args, opts);

    child.stdout.on('data', (data) => {
      // use custom log function
      opts.log(stringify(data));
    });

    child.stderr.on('data', (data) => {
      // use custom error function
      opts.error(stringify(data));
    });

    child.on('close', (code) => {
      if (code === 0) {
        resolve();
      } else {
        reject();
      }
    });
  });
};
这将导致以下错误:

Uncaught Exception: test.js
  TypeError: opts.log is not a function
    Socket.<anonymous>
未捕获异常:test.js
TypeError:opts.log不是一个函数
插座

我做错了什么?

spawnPromise
中的
opts
而不是您在上面声明的
opts
,它是您为
spawnPromise
声明的参数,如下:

const spawnPromise = (cmd, args, opts) => {
// ------------------------------^^^^
该参数对模块全局设置阴影
spawnPromise
将使用您传递给它的内容,而不是全局模块。如果要使用全局模块,请更改其名称或参数


可能(请参见
此处您没有指定,但您可能使用
opts
参数调用
promise
,而不是在顶部定义的
opts
,或者在函数调用中根本不向该参数传递任何内容,这将使其未定义


opts.log
不是一个函数时,独立模块抛出一个特定的错误,或者以其他明确的方式处理它,这可能是一个好主意。

您是如何调用
的?
// define custom logger
const defaultOpts = {                          // <=== Change name
    log: console.log,
    error: console.error
};

const spawnPromise = (cmd, args, opts) => {
  opts = Object.assign({}, defaultOpts, opts); // <=== Expand with defaults
  return new Promise((resolve, reject) => {
    const child = spawn(cmd, args, opts);

    child.stdout.on('data', (data) => {
      // use custom log function
      opts.log(stringify(data));
    });

    child.stderr.on('data', (data) => {
      // use custom error function
      opts.error(stringify(data));
    });

    child.on('close', (code) => {
      if (code === 0) {
        resolve();
      } else {
        reject();
      }
    });
  });
};
  opts = {...defaultOpts, ...opts};