Как отправить запрос в декораторе класса в машинописном тексте - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь отправить 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')]);
    }
}
...