我的代码如下:
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();
}
}
这样做的问题是,当我在expect.getResponseFromURL().getStatus().toBe(200)
可以正常工作之前测试此异步函数时,如果我的容器类(返回类型getResponseFromURL())是状态和主体的容器。
测试如下所示:
test('Async function', async () => {
expect.assertions(1);
const data = await ContainerGlobals.getResponseFromURL().getStatus();
expect(data).toBe(207);
});
现在我从.getStatus()
中收到错误消息,我不确定如何绕过此错误?
“在Promise上不存在”
答案 0 :(得分:1)
在上面的代码中,await
的调用结果是getStatus
的调用结果。
ContainerGlobals.getResponseFromURL()
返回一个ContainerGlobals.getResponseFromURL()
并立即在Promise
上调用getStatus()
给出了一个错误,因为Promise
“ getStatus
上不存在”
Promise
需要在await
返回的Promise
上调用,而ContainerGlobals.getResponseFromURL()
应该在getStatus
返回的结果上调用。
解决此问题的最快方法是在await
上加上括号:
await
...但是您可能希望将test('Async function', async () => {
expect.assertions(1);
const data = (await ContainerGlobals.getResponseFromURL()).getStatus();
expect(data).toBe(207); // SUCCESS
});
行分成两行以提高可读性:
await