Javascript 使用承诺或回调时返回未定义的Decorator函数

Javascript 使用承诺或回调时返回未定义的Decorator函数,javascript,typescript,decorator,typescript-decorator,Javascript,Typescript,Decorator,Typescript Decorator,例如,我试图在NodeJS中创建一个decorator来记录函数执行时的入口和出口 使用参数5,1执行ServiceClass.sampleService 然后在执行完成后执行ServiceClass.sampleService完成,并显示成功/错误 这对于返回数字、字符串、数组或某些对象文本的普通函数来说很好,但是当我想要修饰一个返回承诺或回调的函数时,它会记录详细信息,但在调用函数的地方不会返回值 以下是我的示例代码: logger.ts(包含装饰器功能) sampleService.ts(

例如,我试图在NodeJS中创建一个decorator来记录函数执行时的入口和出口
使用参数5,1执行ServiceClass.sampleService
然后在执行完成后
执行ServiceClass.sampleService完成,并显示成功/错误

这对于返回数字、字符串、数组或某些对象文本的普通函数来说很好,但是当我想要修饰一个返回承诺或回调的函数时,它会记录详细信息,但在调用函数的地方不会返回值

以下是我的示例代码:

logger.ts(包含装饰器功能)

sampleService.ts(常规服务类)

我错过了什么

编辑

当我有一个返回回调函数的函数时,也会出现类似的问题

export default class SampleService {
    @performanceLog
    public sum(a, b, callback) {
        // return new Promise((resolve, reject) => {
        if (err) {
            return callback(a - b, null);
        } else {
            return callback(null, a+b);
        }
        // })
    }
}

const e = new SampleService();
// e.sum(51, 6).then(data => console.log("## Data: ", data)).catch(err => console.log("##err: ", err));

e.sum(51, 6, function (err, res) {
    console.log(`This is err  ${err} and res ${res}`);
});

您自己说过,调用函数时不会返回值:-) 您正在执行
performanceLog
decorator中的原始承诺,然后在
then
回调中进行性能度量。在这里,您传递来自原始函数的值,但不返回到外部。假设您的Promise callstack是这样的:

sum(51,6)
  .then(yourPromiseLog)
  .then(theCallbackFromOutside)
解决方案是再次在decorator中返回值:

return original.apply(this, args).then(data => {
  let end: any = new Date();
  end = end-start;
  console.log(`\nExecution of ${target.constructor.name}.${name} completed successfully in ${end / 1000} seconds`);
  return data;
})
类似地,您必须在catch回调中再次抛出错误:

catch(error => {
  let end: any = new Date();
  end = end-start;
  console.log(`\nExecution of ${target.constructor.name}.${name} completed with error in ${end / 1000} seconds`);
  return Promise.reject(error);
});

希望这有帮助

您自己说过,调用函数时不会返回值:-) 您正在执行
performanceLog
decorator中的原始承诺,然后在
then
回调中进行性能度量。在这里,您传递来自原始函数的值,但不返回到外部。假设您的Promise callstack是这样的:

sum(51,6)
  .then(yourPromiseLog)
  .then(theCallbackFromOutside)
解决方案是再次在decorator中返回值:

return original.apply(this, args).then(data => {
  let end: any = new Date();
  end = end-start;
  console.log(`\nExecution of ${target.constructor.name}.${name} completed successfully in ${end / 1000} seconds`);
  return data;
})
类似地,您必须在catch回调中再次抛出错误:

catch(error => {
  let end: any = new Date();
  end = end-start;
  console.log(`\nExecution of ${target.constructor.name}.${name} completed with error in ${end / 1000} seconds`);
  return Promise.reject(error);
});

希望这有帮助

这是因为您正在覆盖
Promise
值。在
then
catch
中返回的值将传播到承诺链的其余部分

如果您只想“窥探”
承诺
,则
返回
/
抛出
值或不返回新的
承诺
。例如:

const promise = original.apply(this, args)

promise.then(data => {
    let end: any = new Date();
    end = end-start;
    console.log(`\nExecution of ${target.constructor.name}.${name} completed successfully in ${end / 1000} seconds`);
}).catch(error => {
    let end: any = new Date();
    end = end-start;
    console.log(`\nExecution of ${target.constructor.name}.${name} completed with error in ${end / 1000} seconds`);
});

return promise


这是因为您正在重写
Promise
值。在
then
catch
中返回的值将传播到承诺链的其余部分

如果您只想“窥探”
承诺
,则
返回
/
抛出
值或不返回新的
承诺
。例如:

const promise = original.apply(this, args)

promise.then(data => {
    let end: any = new Date();
    end = end-start;
    console.log(`\nExecution of ${target.constructor.name}.${name} completed successfully in ${end / 1000} seconds`);
}).catch(error => {
    let end: any = new Date();
    end = end-start;
    console.log(`\nExecution of ${target.constructor.name}.${name} completed with error in ${end / 1000} seconds`);
});

return promise


谢谢,你的第一个似乎是一个更干净的方法它起作用了。但同样,我不能用这个方法在变量中存储回调(ia函数返回一个),因为它总是有未定义的。我不太明白,你是说在修饰函数返回函数的情况下吗?这是一个简单的错误第一个回调函数,我一直希望它是最后一个参数。我试图提示它,然后返回它,但它绝对不会打印任何语言
Promise.resolve(original.apply(this,args))
。如果
original.apply(this,args)
是一个
Promise
它将返回它,否则它将返回一个带值的已解析的Promise。但是它不会等待调用
回调
,这是另一个问题哦,这是一个问题,谢谢,你的第一个方法看起来更干净,它起作用了。但同样,我不能用这个方法在变量中存储回调(ia函数返回一个),因为它总是有未定义的。我不太明白,你是说在修饰函数返回函数的情况下吗?这是一个简单的错误第一个回调函数,我一直希望它是最后一个参数。我试图提示它,然后返回它,但它绝对不会打印任何语言
Promise.resolve(original.apply(this,args))
。如果
original.apply(this,args)
是一个
Promise
它将返回它,否则它将返回一个带值的已解析的Promise。但是它不会等待调用
callback
,这是另一个问题哦,这是一个问题,谢谢你的解释,调用堆栈清除了这个想法:)谢谢你的解释,调用堆栈清除了这个想法:)