Асинхронные функции async/await
Пытаюсь запустить пример с сайта javascript.ru
Не работает код в теме sync/await сайта javascript.ru https://learn.javascript.ru/async-await Вот код:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
async function showAvatar() {
// запрашиваем JSON с данными пользователя
(async () => {
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json();
})();
// запрашиваем информацию об этом пользователе из github
let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
let githubUser = await githubResponse.json();
// отображаем аватар пользователя
let img = document.createElement('img');
img.src = githubUser.avatar_url;
img.className = "promise-avatar-example";
document.body.append(img);
// ждём 3 секунды и затем скрываем аватар
await new Promise((resolve, reject) => setTimeout(resolve, 3000));
img.remove();
return githubUser;
}
showAvatar();
</script>
</body>
</html>
|
denis_alekss,
всё работает
<script>
async function showAvatar() {
// запрашиваем JSON с данными пользователя
let response = await fetch('https://learn.javascript.ru/article/promise-chaining/user.json');
let user = await response.json();
// запрашиваем информацию об этом пользователе из github
let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);
let githubUser = await githubResponse.json();
// отображаем аватар пользователя
let img = document.createElement('img');
img.src = githubUser.avatar_url;
img.className = "promise-avatar-example";
document.body.append(img);
// ждём 3 секунды и затем скрываем аватар
await new Promise((resolve, reject) => setTimeout(resolve, 3000));
img.remove();
return githubUser;
}
showAvatar();
</script>
|
Как мы можем вызвать функцию r не объявляя ее?
Интересует вторая строка после конст.
const delay = function(ms) {
return new Promise(function (r) { setTimeout((function () { r() } ),ms) } )
Вначале создается анонимная функция с параметром r, а в теле этой анонимной функции вызывается функция r внутри функции setTimeout, , откуда взялся вызов функции r? Я ведь ее не объявлял, у меня только был параметр с именем r в анонимной, функции r нигде не объявлена как функция. Я про этот вызов r() в анонимной функции.
<script>
const delay = function(ms) {
return new Promise(function (r){ setTimeout((function () {r()}),ms)})
}
const url = 'https://jsonplaceholder.typicode.com/todos'
function fetchTodos(){
console.log('Fetch todo started')
return delay(2000).then(()=>{
return fetch(url) }).then(response => response.json())
}
fetchTodos()
.then(data =>{
console.log('Data', data)})
.catch(e=>console.error(e))
</script>
|
Цитата:
Цитата:
|
Я читал что первый параметр resolve если успешно второй если не успешно rejected. Тут просто используется вроде объекты первого класса тема? Глянем на этот код:
function (r) { setTimeout((function () { r() } )
Я попробовал простой пример который не относится вообще к асинхронным функциям, вот ниже написал, просто этот подход используется в том коде. ((n)=>n)(console.log(5)) Здесь делается похожее. n изначально было просто параметром, а потом превратилось в функцию с именем n. Перепишем обычным кодом:
(function (n) {return n})(console.log(5))
Вызывается сразу функция n которую я даже не объявлял, я объявил просто параметр n в анонимной функции. Как кстати переписать эти 2 строчки чтобы вызвать отдельно а не сразу после объявления? Понял, вот так можно через ссылку.
let d = (function (n) {return n})
console.log(d(5))
или так: let d = (n=>n) console.log(d(5)) |
Вот это
(function (n) {return n})(console.log(5)) вообще полная ерунда Перепишите это так (function () {return})(console.log(5)) И вы получите тот же самый результат. Ну вы сами подумайте! Вы объявляете функцию function (n) {return n} Потом ее сразу вызываете, передавая параметр console.log(5). Сначала параметр должен быть вычислен. Он вычисляется, при этом выводит в консоль "5". Функция console.log возвращает undefined. Это значение передается в вашу функцию как параметр n. И потом возвращается. Ну попробуйте так (function (n) {console.log(n); return n}) (console.log(5)) Если вы хотите, что бы ВАША функция выводили значение, то надо так (function (n) { n(5) }) (console.log) |
Спассибо за комментарий выше.
Вернемся к коду. Не совсем понял вот эту строку: return fetch(url) }).then(response => response.json()) Что происходит здесь? fetch это встроенный метод Обещаний в который мы передаем в качестве параметра url а затем в обещание через тот же подход через функцию response вызываем метод json, он вытягивает эту ссылку или что? |
Цитата:
Просто надо больше читать документацию. https://learn.javascript.ru/fetch https://developer.mozilla.org/ru/docs/Web/API/Fetch_API fetch(url) - делает запрос к серверу и возвращает Promise, разрешаемый, когда будет получен ответ. Этот ответ передается как response в then Если этот ответ представлен в виде строки JSON, response.json() парсит этот ответ и возвращает Promise с объектом результатом. |
fetch(url) возвращает объект промис, response это объект промис, который мы создаем в then и через него получаем доступ в json() чтобы вытащить этот url и в дальнейшем вывести ссылку https://jsonplaceholder.typicode.com/todos через консоль?
|
Цитата:
Цитата:
Цитата:
Цитата:
then тоже возвращает промис, который разрешается со значением объекта, который вернул json(). |
| Часовой пояс GMT +3, время: 16:04. |