Значение конструктора не было создано за время до того, как конечная точка API вернет ответ - PullRequest
0 голосов
/ 13 февраля 2019

По сути, у меня возникает проблема, когда я создаю экземпляр этого класса, что свойство .token не инициализируется вовремя, чтобы использовать его при вызове экземпляра.

Я преобразовал функцию васинхронная функция, которая возвращает обещание и разрешает токен API.Этот функционал работает.

Когда я перехожу к своему контроллеру, и когда я let t = new API и сразу console.log(t.token);, он печатает неопределенно.Когда я делаю установленное время ожидания в течение нескольких секунд и затем печатаю t.token, я получаю токен.

Мне нужно, чтобы продолжить выполнение после полного создания экземпляра.Как я могу это сделать?

Вот конструктор и соответствующая функция, которая запускает запрос на получение токена / извлекает его из кэша.

constructor() {
        // All this should go to .env
        this.api_key = 'key';
        this.api_url = 'https://some.api.com/v2';
        this.api_clientId = 'id';
        this.api_clientSecret = 'secret';
        //this.token = this.getAccessToken();
        //console.log(this.getAccessToken());
        this.getAccessToken().then((token)=>{
                console.log('In Initialization'+ token);
                this.token = token;
            });
    }

    private async getAccessToken(): Promise<any> {
        let token = new Promise(resolve => {
            myCache.get('apiKey', (err, result)=>{
                if(err) throw err;
                if(result == undefined){
                    request('https://some.api.com/oauth/v2/token',{
                        method:'POST',
                        form: {
                            grant_type: 'client_credentials',
                            client_id: this.api_clientId,
                            client_secret: this.api_clientSecret
                        }
                    }, (err, res, body) => {
                        if(err) throw err;
                        myCache.set('apiKey', body, (err2: any, suc: any)=>{
                            if (err2) throw err2;
                            resolve(body);
                        });
                    });
                } else {
                    resolve(result);
                }
            });
        });
        return token;
    }

Вот где создается экземпляр:

export const getSomething = (req: Request, res: Response)=>{
    let t = new API;
    setTimeout(()=>console.log('In Timeout:   ' + t.token), 1000);
    console.log(t.token);
    return res.send({token: t.token});
}

Ответ JSON не содержит токен, когда ответ отправляется как при извлечении из кэша, так и при жестком запросе по API - но печатается после setTimeout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...