Я пытаюсь получить некоторые данные со своего сервера, используя 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) говорит, что «ожидание» не влияет на тип этого выражения. Поэтому я в замешательстве, почему мне нужно снова ждать данных, если я возвращаю ожидаемое данные?
«но мой редактор кода (vscode) говорит, что «ожидание» не влияет на тип этого выражения». - Это похоже на ошибку. await наверняка оказывает эффект при использовании на Promise. Судя по показанному коду, проблема просто в том, что вы не ждете getData(url). (Либо с помощью await и созданием mainFunction также async, либо с помощью обратного вызова .then().)
@Дэвид, теперь я понял. Так что это, вероятно, ошибка vscode, вот что меня смутило.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Согласно документам:
Объявление асинхронной функции создает объект AsyncFunction. Каждый раз, когда вызывается асинхронная функция, она возвращает новое обещание, которое будет разрешено со значением, возвращаемым асинхронной функцией, или отклонено с исключением, не перехваченным в асинхронной функции.
Итак, асинхронная функция всегда возвращает Promise
Вы можете использовать then для получения данных:
mainFunction() {
const result = getData(url).then(data => data.map(x => x.key))
}
О, теперь я понял. Итак, в вашем примере result все равно будет обещанием, не так ли?
Это не так. Внутри асинхронной функции данные — это значение, к которому разрешается обещание. Но асинхронные функции всегда возвращают обещания, именно так они поддерживают ожидание внутри.