Мой код выглядит так:
public getUrl(url) {
//returns URL
... }
public getResponseFromURL(): container {
let myStatus = 4;
const abc = http.get(url, (respon) =>
const { statusCode } = respon;
myStatus = statusCode;
console.log('Inside callback' +myStatus);
.on('error', (err) => {
console.log('Things have gone wrong' + err);
});
console.log('ITS COMPLICATED' +myStatus);
return new Container(status, body, header);
}
}
Проблема, с которой я сталкиваюсь, связана с асинхронной природой JS, и файл console.log ('ITS COMPLICATED') выполняется раньше, чем в функции обратного вызова. Я пытаюсь выполнить первый до последнего console.log!
Я использую Async / Await, как показано ниже:
public timeoutPromise(time: any) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(Date.now());
}, time);
});
}
public doSomethingAsync() {
return this.timeoutPromise(1000);
}
В результате изменил мой getResponseFromURL () на:
public async getResponseFromURL(): Promise<container> {
this.myStatus = 7;
console.log(0);
await this.doSomethingAsync();
console.log(1);
const abc = http.get(url, (respon) => {
const { statusCode } = respon;
this.myStatus = statusCode;
console.log('Inside Callback ' + statusCode);
}).on('error', (err) => {
console.log('Things have gone wrong ' + err);
});
await this.doSomethingAsync();
console.log(2);
await this.doSomethingAsync();
console.log('Is it simple lalala ' + this.myStatus);
await this.doSomethingAsync();
}
}
Проблема с этим заключалась в том, что мой контейнерный класс (возвращаемый тип getResponseFromURL ()) является контейнером для состояния и тела, когда я тестирую эту асинхронную функцию, до того, как expect.getResponseFromURL().getStatus().toBe(200)
сработает.
Тест выглядит следующим образом:
test('Async function', async () => {
expect.assertions(1);
const data = await ContainerGlobals.getResponseFromURL().getStatus();
expect(data).toBe(207);
});
Теперь я получаю ошибку от .getStatus()
, и я не уверен, как обойти эту ошибку?
"не существует на Promise"