Не удается дождаться асинхронного вызова в Javascript

#javascript

Вопрос:

У меня есть звонок в AWS, где я получаю ответ, и обратный вызов выглядит так:

 const handleResponse = async (response) => {
  var responseBody = "";
  response.on("data", async function (chunk) {
    responseBody  = chunk;
  });
  response.on("end", async function (chunk) {
    return responseBody;
  });
  return responseBody;
};

 

Моя текущая попытка состоит в том, чтобы вызвать эту функцию с ожиданием, подобным такому:

 const getLoadIds = async (payload) => {
  //   console.log(payload);
  const resp = await handleResponse(payload)
  console.log(resp) <--- this is undefined
}
 

Как я могу получить ответ от вызова response.on(«завершение»)?

Вот исходный код вызывающего абонента:

   var client = new AWS.HttpClient();
  try {
    await client.handleRequest(request, null, async (res) => fn(res));
  } catch (err) {
 

fn является псевдонимом для getLoadIds

Комментарии:

1. handleResponse ничего не делает асинхронно… Он просто немедленно возвращает пустую строку.

2. Это потому, что вы сразу же возвращаетесь из handleResponse . Чтобы сделать это, удалите асинхронность из функции, а затем вместо handleResponse этого верните обещание responseBody , которое будет выполнено, когда end произойдет событие. Удалите асинхронность из ваших обратных вызовов.

3. @AndrewLi Вы не могли бы опубликовать пример этого потока?

Ответ №1:

Возможно, вы захотите иметь что-то вроде

 const handleResponse = (response) => {
  return new Promise((resolve) => {
    var responseBody = "";
    response.on("data", function (chunk) {
      responseBody  = chunk;
    });
    response.on("end", function (chunk) {
      resolve(responseBody);
    });
  });
};

 

upd: спасибо @Andrew Li, заметил ошибку в ответе

Комментарии:

1. Однако не забывайте об обработке ошибок

Ответ №2:

Заверните обработчик потока в обещание. resolve он возвращает данные, и reject если в нем есть ошибка.

 function handleResponse() {
  let responseBody = '';
  return new Promise((res, rej) => {
    response.on('data', (chunk) => responseBody  = chunk);
    response.on('end', () => res(responseBody));
    response.on('error', (error) => rej(error));
  });
};

function getLoadIds(payload) {
  const resp = await handleResponse(payload);
  console.log(resp);
}