Проверка асинхронной функции в JS - ошибка: «Вы забыли использовать await» - PullRequest
0 голосов
/ 04 января 2019

Мой код выглядит так:

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"

1 Ответ

0 голосов
/ 07 января 2019

В приведенном выше коде 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
});
...