Javascript 使用承诺或回调时返回未定义的Decorator函数
例如,我试图在NodeJS中创建一个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(
使用参数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
,这是另一个问题哦,这是一个问题,谢谢你的解释,调用堆栈清除了这个想法:)谢谢你的解释,调用堆栈清除了这个想法:)