По сути, у меня возникает проблема, когда я создаю экземпляр этого класса, что свойство .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.