Как получить тело ответа из get-запроса needle js

Рейтинг: 0Ответов: 1Опубликовано: 05.08.2023

Мне нужно внутри asynс функции вызвать needle и обработать тело ответа вне самой needle.

Внутри коллбэка я получаю тело ответа и могу делать с ним все что захочу:

const needle = require('needle');

const data = needle("get", "https://ya.ru", function (error, response) {
   const body = response.body;
   console.log(body);
  });

Однако попытка вернуть тело ответа дает "Promise { <pending> }"

const needle = require('needle');

const data = needle("get", "https://ya.ru")
  .then(function (response) {
   return response.body;
  });

console.log(data);

Попытка записать результат в заранее определенную переменную также не дает результата:

let res = '';

const data = needle("get", "https://ya.ru")
  .then(function (response) {
   res = response.body;
  });

console.log(res);

Я новичок в JS, честно пытаюсь разобраться в асинхронном коде, однако в учебниках в основном отвлеченные примеры, которые объясняют как работает async, но не дают решения конкретно этой задачи либо я не могу это понять.

Я понимаю, что у асинхронной функции есть несколько состояний и надо дождаться, пока функция будет выполнена, чтобы получить результат. Но как именно это сделать - не понимаю.

В других подобных случаях часто советуют использовать then или async / await, но then у меня дает все также pending, а как правильно использовать async await внутри await функции понять не получается.

Помогите, пожалуйста, разобраться.

Ответы

▲ 0Принят

Концепция асинхронности в JavaScript может быть немного запутанной для новичков, но я постараюсь разъяснить, как работает ваш случай и как использовать async/await.

Сначала давайте разберем, почему ваш код не работает. Ваш код с использованием then выглядит правильно, но выводит "Promise { }", потому что к моменту, когда console.log(data) выполняется, обещание (Promise) еще не было разрешено (resolved). Обещания работают асинхронно, и выполнение кода продолжается, пока обещание не будет разрешено.

Для решения этой проблемы вы можете использовать async/await, чтобы "дождаться" разрешения обещания. Вот как это делается:

const needle = require('needle');

async function fetchData() {
  try {
    const response = await needle("get", "https://ya.ru");
    const body = response.body;
    return body;
  } catch (error) {
    console.error(error);
    return null;
  }
}

async function main() {
  const data = await fetchData();
  console.log(data);
}

main();

В этом коде:

Мы определяем функцию fetchData(), которая использует async/await для ожидания результата от обещания, созданного функцией needle. Затем мы определяем асинхронную функцию main(), которая вызывает fetchData() с помощью await, дожидается её выполнения и затем выводит результат. В конце вызываем main(), чтобы начать выполнение асинхронного кода. Обратите внимание, что await может использоваться только внутри асинхронной функции, поэтому мы создали асинхронную функцию main(). Это позволяет вам писать код более последовательно, как будто он выполняется синхронно.

Таким образом, использование async/await позволяет более четко и линейно представлять себе последовательность выполнения асинхронного кода.