gpt4 book ai didi

typescript - 在 JS 中测试异步函数 - 错误 : "Did you forget to use await"

转载 作者:搜寻专家 更新时间:2023-10-30 21:09:53 25 4
gpt4 key购买 nike

我的代码是这样的:

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() 之前测试此异步函数时,如果我的容器类(getResponseFromURL() 的返回类型)是状态和正文的容器。 toBe(200) 会起作用。

测试如下:

  test('Async function', async () => {
expect.assertions(1);
const data = await ContainerGlobals.getResponseFromURL().getStatus();
expect(data).toBe(207);
});

现在我从 .getStatus() 收到错误,我不确定如何绕过这个错误?

"does not exist on Promise"

最佳答案

在上面的代码中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为了便于阅读,将一行分成两行:

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
});

关于typescript - 在 JS 中测试异步函数 - 错误 : "Did you forget to use await",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54043275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com