Javascript Promises vs Async Await. Разница?



Я уже использовал функции ES6 и ES7 (благодаря Babel) в своих приложениях - как мобильных, так и веб -.



Первый шаг, очевидно, был сделан к уровням ES6. Я узнал много асинхронных паттернов, обещаний (которые действительно многообещающи), генераторов (не уверен, почему символ*) и т. д.,
Из всего этого обещания вполне соответствовали моим целям. И я довольно часто использую их в своих приложениях.

Вот пример / псевдокод того, как я реализовал базовый обещание -



var myPromise = new Promise(
function (resolve,reject) {
var x = MyDataStore(myObj);
resolve(x);
});

myPromise.then(
function (x) {
init(x);
});


Со временем я наткнулся на функции ES7, и одной из них были ключевые слова/функции ASYNC и AWAIT. Они в совокупности творят великие чудеса. Я начал заменять некоторые из моих обещаний на async & await. Они, по-видимому, придают большое значение стилю программирования.

Опять же, вот псевдокод того, как выглядит моя асинхронная функция ожидания-



async function myAsyncFunction (myObj) {
var x = new MyDataStore(myObj);
return await x.init();
}
var returnVal = await myAsyncFunction(obj);


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

Мой вопрос вот в чем: зачем нужна асинхронность,ожидание, когда обещания делают подобную работу?
Может ли асинхронность,ожидание решить большую проблему? или это было просто другое решение для обратного вызова ада?
Как я уже говорил ранее, я могу использовать обещания и асинхронность, ожидание, чтобы решить ту же проблему. Есть ли что-то конкретное, что Async Await решил?



Дополнительные Примечания:
Я использую Async, Waits & Promises в моих проектах ReactJS и модулях узлов широко.
ReactJS особенно были ранней птицей и приняли много функций ES6 и ES7.

747   6  

6 ответов:

Зачем нужна асинхронность, ожидание, когда обещания делают подобную работу? Может ли асинхронность,ожидание решить большую проблему?

async/await просто дает вам Синхронное ощущение асинхронного кода. Это очень изящная форма синтаксического сахара.

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

Если вам интересно знать, вы можете использовать библиотеку, как co (наряду с генераторами), чтобы дать такое же ощущение. Подобные вещи были разработаны для решения проблемы, которую async/await в конечном счете решает (изначально).

Async / Await обеспечивают гораздо более приятный синтаксис в более сложных сценариях. В частности, все, что связано с циклами или некоторыми другими конструкциями, такими как try/catch.

Например:

while (!value) {
  const intermediate = await operation1();
  value = await operation2(intermediate);
}
Этот пример был бы значительно более запутанным, просто используя обещания.

Полное сравнение с плюсами и минусами.

Обычный JavaScript

  • Плюсы
  • не требует каких-либо дополнительных библиотек или технологий
  • обеспечивает наилучшую производительность
  • обеспечивает наилучший уровень совместимости со сторонними библиотеками
  • позволяет создавать специальные и более продвинутые алгоритмы
  • минусы
  • может потребоваться дополнительная код и относительно сложные алгоритмы

Async (библиотека)

  • Плюсы
  • упрощает наиболее распространенные схемы потока управления
  • по-прежнему является решением на основе обратного вызова
  • Хорошая производительность
  • минусы
  • вводит внешнюю зависимость
  • все еще может быть недостаточно для продвинутых потоков

Обещания

  • Плюсы
  • значительно упрощает наиболее распространенные схемы потока управления
  • надежная обработка ошибок
  • часть спецификации ES2015
  • гарантирует отсроченное обращение к исполненным и отвергнутым
  • минусы
  • требует promisify callback-based API
  • вводит небольшой хит производительности

Генераторы

  • Плюсы
  • делает неблокирующий API похожим на блокирующий
  • упрощает обработку ошибок
  • часть спецификации ES2015
  • минусы
  • требуется дополнительная библиотека потоков управления
  • по-прежнему требует обратных вызовов или обещаний реализовать не последовательные потоки
  • требует thunkify или promisify API на основе nongenerator

Асинхронное ожидание

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

Async / await может помочь сделать ваш код чище и более читаемым в тех случаях, когда вам нужен сложный поток управления. Он также производит более удобный для отладки код. И позволяет обрабатывать как синхронные, так и асинхронные ошибки с помощью только try/catch.

Недавно я написал этот пост, демонстрирующий преимущества async / await над promises в некоторых распространенных случаях использования с примерами кода https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9

Оба способа обработки асинхронного кода. Но есть разница с исполнением каждого. Вот рабочее исполнение -

Обещание

Объект Promise представляет возможное завершение (или отказ) асинхронной операции и ее результирующее значение. Это прокси для значения, не обязательно известного во время его создания, и он представляет собой будущий результат асинхронной операции. Вызывающий код может подождать, пока это обещание не будет выполнено. перед выполнением следующего шага. Для этого у обещания есть метод с именем then, который принимает функцию, которая будет вызвана, когда обещание будет выполнено.

Async / await

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

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

Плюсы async / await над promise

  • Async / await построен для того, чтобы дать чистый синтаксис семантика продолжения асинхронных операций.
  • он избегает обратного вызова / обещания ада.

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

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

Цепочка обещаний:

function logFetch(url) {
  return fetch(url)
    .then(response => response.text())
    .then(text => {
      console.log(text);
    }).catch(err => {
      console.error('fetch failed', err);
    });
}

Async функция:

async function logFetch(url) {
  try {
    const response = await fetch(url);
    console.log(await response.text());
  }
  catch (err) {
    console.log('fetch failed', err);
  }
}

В приведенном выше примере await ожидает, что обещание (fetch(url)) будет либо разрешено, либо отклонено. Если обещание разрешено, значение сохраняется в переменной response, если обещание отклонено, это вызовет ошибку и таким образом войдите в блок catch.

Мы уже можем видеть, что использование async/await может быть, это более читабельно, чем цепочка обещаний. Это особенно верно, когда количество обещаний, которые мы используем, увеличивается. Оба обещают цепочку и async/await Решите проблему обратного вызова ада, и какой метод вы выберете, зависит от личных предпочтений.

Comments

    Ничего не найдено.