lan*_*ilz 6 async-await typescript es6-promise jestjs
我的代码如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我面临的问题是由于 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);
}
Run Code Online (Sandbox Code Playgroud)
结果将我的 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();
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的问题是,如果我的容器类(getResponseFromURL() 的返回类型)在我测试此异步函数时是状态和正文的容器,那么之前expect.getResponseFromURL().getStatus().toBe(200)会起作用。
测试如下所示:
test('Async function', async () => {
expect.assertions(1);
const data = await ContainerGlobals.getResponseFromURL().getStatus();
expect(data).toBe(207);
});
Run Code Online (Sandbox Code Playgroud)
现在我收到错误.getStatus(),我不知道如何绕过这个错误?
“不存在于 Promise”
在上面的代码中await,调用了调用的getStatus结果ContainerGlobals.getResponseFromURL()。
ContainerGlobals.getResponseFromURL()返回 aPromise并立即调用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
});
Run Code Online (Sandbox Code Playgroud)
await...但是为了便于阅读,您可能希望将该行分成两行:
test('Async function', async () => {
expect.assertions(1);
const result = await ContainerGlobals.getResponseFromURL(); // let the Promise resolve
const data = result.getStatus(); // call getStatus on the result
expect(data).toBe(207); // SUCCESS
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19162 次 |
| 最近记录: |