Зачем await response.json() возвращать обещание?

Я пытаюсь получить некоторые данные со своего сервера, используя API-интерфейс FEATH с async/await. Я знаю, что могу сделать это внутри асинхронной функции.

async function someFunction(url) {
    let response = await fecth(url)
    let data = await response.json()
    // Here I can use the data
    console.info(data) // print the data correctly
    data.map(x => x.key) // works well
}

Однако если я верну данные и попытаюсь использовать их в другой функции, она вернет обещание, но почему?

function mainFunction() {
    let data = getData(url)
    // Here data is again a promise
    console.info(data) // "Promise {<pending>}"
    data.map(x => x.key) // "Uncaught TypeError: data.map is not a function"
}

async function getData(url) {
    let response = await fecth(url)
    let data = await response.json()
    console.info(data) // print the data correctly
    return data
}

если я использую data = await getData(url), он снова работает, но мой редактор кода (vscode) говорит, что «ожидание» не влияет на тип этого выражения. Поэтому я в замешательстве, почему мне нужно снова ждать данных, если я возвращаю ожидаемое данные?

Это не так. Внутри асинхронной функции данные — это значение, к которому разрешается обещание. Но асинхронные функции всегда возвращают обещания, именно так они поддерживают ожидание внутри.

jonrsharpe 18.03.2024 21:50

«но мой редактор кода (vscode) говорит, что «ожидание» не влияет на тип этого выражения». - Это похоже на ошибку. await наверняка оказывает эффект при использовании на Promise. Судя по показанному коду, проблема просто в том, что вы не ждете getData(url). (Либо с помощью await и созданием mainFunction также async, либо с помощью обратного вызова .then().)

David 18.03.2024 21:53

@Дэвид, теперь я понял. Так что это, вероятно, ошибка vscode, вот что меня смутило.

Angel Torres 19.03.2024 14:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно документам:

Объявление асинхронной функции создает объект AsyncFunction. Каждый раз, когда вызывается асинхронная функция, она возвращает новое обещание, которое будет разрешено со значением, возвращаемым асинхронной функцией, или отклонено с исключением, не перехваченным в асинхронной функции.

Итак, асинхронная функция всегда возвращает Promise

Вы можете использовать then для получения данных:

mainFunction() {
  const result = getData(url).then(data => data.map(x => x.key))
}

О, теперь я понял. Итак, в вашем примере result все равно будет обещанием, не так ли?

Angel Torres 19.03.2024 14:21

Другие вопросы по теме

Похожие вопросы

Предотвратить добавление дубликатов в лист Google из сценария приложений?
Как изменить размер шрифта, ограничив его увеличение или уменьшение дважды с помощью vanilla JS
Значения dateTime не отображаются в таблице данных. Как обрабатывать dateTime между javascript (VueJS) и php (laravel)?
Как проверить проверку с помощью библиотеки реагирования-тестирования и хука формы реагирования?
Почему наблюдатель мутаций обрабатывается с помощью очереди микрозадач, а не очереди макрозадач?
Как поместить отфильтрованные значения в раскрывающийся список
Как я могу использовать файл Json в файле JavaScript
Сделать безопасным вызов перехватчика за пределами поставщика Redux при доступе к хранилищу Redux?
Почему предотвращается Default() для остановки события ввода, изменения значения элемента формы
Как мне предотвратить выход моего движущегося div за пределы страницы/экрана в jquery?