ES8 с использованием функции стрелки с асинхронным и ожиданием

В настоящее время я изучаю, как использовать выборку, асинхронность и ожидание ES8. В настоящее время у меня есть этот код, который работает:

const url = "https://api.icndb.com/jokes/random";

async function tellJoke() {
  let data = await (await fetch(url)).json();
  return data.value.joke;
}

tellJoke().then(data => console.log(data));

Консоль:

"Chuck Norris can dereference NULL."

но я нашел фрагмент с использованием функции стрелки, проблема в том, что я не знаю, как вернуть свое значение так, как я делаю это в моем текущем примере.

СНИППЕТ:

const fetchAsync = async () => 
await (await fetch(url)).json()

Если это не лучшая практика, дайте мне знать, также приветствуется любое дальнейшее чтение.


person ricardoNava    schedule 23.08.2017    source источник
comment
Лучше всего использовать стрелочные функции только тогда, когда они вам нужны. Просто используйте свой рабочий код :-)   -  person Bergi    schedule 23.08.2017
comment
Кстати, async/await является частью ES8, а не ES7.   -  person Bergi    schedule 23.08.2017
comment
@Bergi, это правда, забыл проверить MDN и каждый найденный мной пример упоминал ES7.   -  person ricardoNava    schedule 23.08.2017


Ответы (2)


Вы можете снова использовать тот же подход, который вы использовали для сокращения обычного

async function tellJoke() {
  let response = await fetch(url);
  let data = await response.json();
  return data.value.joke;
}

к вашей реализации. В однострочном виде это может выглядеть так:

const tellJoke = async () => (await (await fetch(url)).json()).value.joke;
person Bergi    schedule 23.08.2017
comment
Хорошо, теперь я понимаю, кстати, я думаю, что выполнение let data = await response.json().value.joke; return data; Выглядит лучше, чем let data = await response.json(); return data.value.joke; Могу я узнать ваше мнение об этом? - person ricardoNava; 23.08.2017
comment
Мое личное мнение - не вводить еще одну переменную только для ее возврата - return из функции с именем tellJoke уже достаточно описателен. В любом случае, ваш первый фрагмент не работает, вам нужны круглые скобки вокруг выражения await. - person Bergi; 23.08.2017

Используйте то же самое в функции. Если в вашем коде нет выражения тела (без {}), он вернет результат оператора. В этом случае результат await (await fetch(url)).json().value.joke.

const fetchAsync = async () => (await (await fetch(url)).json()).value.joke;

или с многострочным телом. С выражением тела {} вам нужно явно вернуть, как в простой функции.

const fetchAsync = async () => {
   const result = await fetch(url);
   const data = await result.json();
   return data.value.joke;
}
person Suren Srapyan    schedule 23.08.2017
comment
.json().value.joke ... Я думаю, вам нужно немного () (await (await fetch(url)).json()).value.joke; - person Jaromanda X; 23.08.2017
comment
где я показал - я думаю ... я, наверное, должен проверить, прежде чем говорить :p - person Jaromanda X; 23.08.2017
comment
да, ваш код неверен, потому что он попытается получить доступ к json().value.joke ... но json() возвращает обещание, которое не имеет свойства value, и в любом случае это не будет значение json - person Jaromanda X; 23.08.2017
comment
Понятно. Спасибо. - person Suren Srapyan; 23.08.2017