面试题答案
一键面试特殊情况及要点
- 异步操作执行顺序:
- 在装饰器中,若对异步方法进行操作,需注意装饰器本身执行顺序和异步方法内部执行顺序。装饰器函数在方法定义时就执行,而不是在方法调用时。如果装饰器中执行异步操作,要确保其不影响异步方法本身逻辑。
- 例如,若装饰器用于记录方法执行时间,需要正确获取异步方法开始和结束时间,不能因装饰器异步操作干扰。
- 异常处理:
- 异步方法中抛出的异常需要正确捕获和处理。在装饰器中,不能简单地使用常规的
try - catch
块来捕获异步方法内部的异常,因为异步方法返回的是Promise
,异常是通过Promise
的reject
处理。 - 例如,当异步方法因网络错误等原因失败时,装饰器要能正确捕获并处理该异常,避免异常未处理导致程序崩溃。
- 异步方法中抛出的异常需要正确捕获和处理。在装饰器中,不能简单地使用常规的
示例代码
// 定义一个方法装饰器
function asyncMethodDecorator(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = async function (...args: any[]) {
try {
console.log('开始执行异步方法');
const result = await originalMethod.apply(this, args);
console.log('异步方法执行完毕');
return result;
} catch (error) {
console.error('异步方法执行出错:', error);
throw error;
}
};
return descriptor;
}
class ExampleClass {
@asyncMethodDecorator
async asyncMethod() {
// 模拟异步操作
await new Promise((resolve) => setTimeout(resolve, 1000));
throw new Error('模拟异步方法错误');
}
}
const example = new ExampleClass();
example.asyncMethod().catch((error) => console.error('外部捕获到的错误:', error));
在上述示例中:
- 装饰器
asyncMethodDecorator
通过await
保证了异步方法originalMethod
的正确执行顺序,先打印“开始执行异步方法”,等异步方法执行完毕后打印“异步方法执行完毕”。 - 使用
try - catch
块在装饰器内部捕获异步方法抛出的异常,打印错误信息,并且重新抛出错误,以便外部也能捕获到该异常,保证了异常处理的完整性。