Можно ли использовать оба ожидания и .then ()?

Я написал немного кода, который выглядит так:

async function fetchData() {
    const json = await fetch(ENDPOINT + key.key).then(data => data.json());
    //Do something with the data
}

Довольно ясно и прямо, что я здесь делаю.

Мне просто интересно, нормально ли сочетать как старый стиль Promise, так и новый стиль async /wait, подобный этому.

Если бы я не использовал .then, тогда я бы хотел что-то вроде этого:

async function fetchData() {
    const data = await fetch(ENDPOINT + key.key); 
    const json = await data.json(); 
    //do something with the data
}

Если я что-то не упустил? Я думаю, вопрос в том, является ли цель async /await прекратить использование обещаний полностью или что?

1 голос | спросил dwjohnston 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 15 Sep 2018 06:02:06 +0300 2018, 06:02:06

2 ответа


1

Даже в современных приложениях обещания разработки очень полезны, и вы вообще не хотите, чтобы await все. Зачем? Потому что await что-то блокирует.

Представьте сценарий, в котором у вас будет приложение, и при открытии экрана вам нужно будет вызвать две несвязанные конечные точки REST.

function loadMyProfileData(userId) { ... }
function loadOrders(userId) { ... }

Обе эти функции выполняют запрос HTTP REST и возвращают обещание. Если у вас была следующая функция:

async function onScreenLoad(userId) {
    this.profileData = await loadMyProfileData(userId);
    this.orders      = await loadOrders(userId);
}

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

В таком сценарии вы, скорее всего, захотите найти что-то вроде этого:

async function onScreenLoad(userId) {
    let [profileData, orders] =
        await Promise.all([loadMyProfileData(userId), loadOrders(userId)]);

    this.profileData = profileData;
    this.orders      = orders;
}

Таким образом вы загружаете данные одновременно.

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

ответил Andy 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 15 Sep 2018 22:25:09 +0300 2018, 22:25:09
1

Асинхронный ожидание - это обещания под капотом. Таким образом, вы можете уйти с асинхронным ожиданием большую часть времени, когда у вас есть последовательность зависимых шагов async для выполнения.

Однако есть моменты, когда вы хотите запускать ряд операций последовательно или параллельно. Там вам обязательно понадобится Promise.all или ждать в цикле for.

Что касается вашего кода:

  1. Вам не нужно await в операторе return async, вы можете просто вернуть обещание напрямую.
  2. Сохранение обещания в переменной требуется только тогда, когда вы хотите сделать что-то другое, чем ждать на нем.
ответил S.D. 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 17 Sep 2018 08:40:06 +0300 2018, 08:40:06

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132