【发布时间】:2019-05-31 06:45:10
【问题描述】:
我的代码如下所示:
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 上不存在”
【问题讨论】:
-
你可以试试这样的异步 doSomethingAsync() { this.asyncResult = await this.httpClient.get(this.url).toPromise(); console.log('没问题,我会等到promise解决了..'); }
-
@AnoopMc 我不确定我是否理解 - 这里的 this.httpClient 和 toPromise() 是什么?
标签: typescript async-await jestjs es6-promise