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};