导入
理解装饰器模式
使用装饰器模式来包装路由处理器、服务和工具,为其添加日志记录、追踪或认证等横切关注点,而无需修改其核心逻辑。
代码示例
1function decorate(originalFn) { 2 return function wrapped(...args) { 3 // 执行前的操作 4 const result = originalFn(...args); 5 // 执行后的操作 6 return result; 7 }; 8}
...
1 / 5
Node.js
1// 模拟异步服务方法 2function fetchUserData(userId) { 3 return new Promise((resolve) => { 4 setTimeout(() => { 5 resolve({ id: userId, name: 'Alice' }); 6 }, 100); 7 }); 8} 9 10// 装饰器:测量执行时间 11function withTiming(fn) { 12 return async function (...args) { 13 const start = Date.now(); 14 const result = await fn(...args); 15 const duration = Date.now() - start; 16 console.log(`[TIMER] ${fn.name} 花费了 ${duration}ms`); 17 return result; 18 }; 19} 20 21// 应用装饰器 22const decoratedFetch = withTiming(fetchUserData); 23 24// 运行 25decoratedFetch(42);
TypeScript
1// 模拟异步服务方法 2function fetchUserData(userId: number): Promise<{ id: number; name: string }> { 3 return new Promise((resolve) => { 4 setTimeout(() => { 5 resolve({ id: userId, name: 'Alice' }); 6 }, 100); 7 }); 8} 9 10// 装饰器:测量执行时间 11function withTiming<T extends (...args: any[]) => Promise<any>>(fn: T): T { 12 return (async function (...args: any[]) { 13 const start = Date.now(); 14 const result = await fn(...args); 15 const duration = Date.now() - start; 16 console.log(`[TIMER] ${fn.name || "Function"} 花费了 ${duration}ms`); 17 return result; 18 }) as T; 19} 20 21// 应用装饰器 22const decoratedFetch = withTiming(fetchUserData); 23 24// 运行 25decoratedFetch(42);