【问题标题】:Test an Async function in JS - Error: "Did you forget to use await"在 JS 中测试异步函数 - 错误:“您是否忘记使用 await”
【发布时间】: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


【解决方案1】:

在上面的代码中,await 在调用getStatus 的结果上调用ContainerGlobals.getResponseFromURL() 的结果。

ContainerGlobals.getResponseFromURL() 返回一个Promise 并立即在Promise 上调用getStatus() 给出一个错误,因为getStatus“在Promise 上不存在”。

ContainerGlobals.getResponseFromURL()返回的Promise需要调用awaitawait返回的结果需要调用getStatus

解决此问题的最快方法是在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
});

【讨论】:

    猜你喜欢
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多