Я пытаюсь отправить HTTP-запрос GET внутри функции декоратора класса. Функция должна извлекать данные из базы данных, а затем заполнять свойство класса при его создании.
Мне удалось заставить его работать с синхронным запросом, но это, похоже, устарело. Я попытался сделать это с помощью асинхронного запроса ax ios, но не смог заставить его работать. Когда я использовал способ async / await
, webpack больше не создавал мои файлы, ссылаясь на то, что у Promises нет свойства prototype. Я попытался использовать вместо этого then
, но тогда моя функция-декоратор больше не возвращала фактический конструктор и, похоже, не заполняла свойство.
Это мой текущий подход с синхронным запросом:
export const EffectClass = <T extends { new(...args: any[]): {} }>(constructor: T) => {
const request = new XMLHttpRequest();
request.open('GET', `/V1/effect/${constructor.name}`, false);
request.send(null);
if (request.status === 200) {
console.log(request.response)
}
console.log(constructor.name);
return class extends constructor {
effects = new EffectCollection([new BooleanEffect(true, 'value')]);
}
}
Хотя это действительно работает, я бы действительно хотел избежать использования устаревшего способа достижения моей цели. Для завершения вот способы, которые я пробовал с then
и с async / await
:
//The httpService uses axios to execute a GET Request, resolve axios' Promise and return the reponse data
export const EffectClass = <T extends { new(...args: any[]): {} }> (constructor: T) => {
httpService.get(`/V1/effect/${constructor.name}`).then(result => {
console.log(constructor.name);
return class extends constructor {
effects = new EffectCollection([new BooleanEffect(true, 'value')]);
}
});
}
, а вот способ с asyn c await
export const EffectClass = async <T extends { new(...args: any[]): {} }>(constructor: T) => {
const matchingEffects = await httpService.get(`/V1/effect/${constructor.name}`);
console.log(constructor.name);
return class extends constructor {
effects = new EffectCollection([new BooleanEffect(true, 'value')]);
}
}