Я пытаюсь написать декоратор, который принимает метод и выдает ошибку, если метод не завершился в течение указанного времени ожидания (указанного с помощью аргументов метода). Не указание тайм-аута должно привести к тому, что метод будет работать, как будто аргумента нет.
export const setMethodTimeout = (): Function => {
return function(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) {
const context = this;
const args: DecoratorArgumentType = arguments;
if (args.timeout) {
const timer = setTimeout(() => {
throw new Error('The method did not finish before the specified timeout.');
}, args.timeout);
const originalMethod = descriptor.value;
descriptor.value = function() {
originalMethod
.apply(context, args)
.then((result: any) => {
clearTimeout(timer);
return result;
})
.catch((e: Error) => {
throw e;
});
};
}
return descriptor;
};
};
Теперь, когда я пытаюсь использовать этот декоратор в моем методе класса:
@setMethodTimeout
public async getMap(params: GetMapParams, api: ApiType, reqConfig?: RequestConfiguration): Promise<Blob> {
//...
}
I получите следующую ошибку машинописного текста:
'setMethodTimeout' принимает слишком мало аргументов для использования здесь в качестве декоратора. Вы хотели сначала вызвать его и написать «@setMethodTimeout ()»?
Почему это происходит?