Nano Hash - криптовалюты, майнинг, программирование

Что плохого в ожидании цепочки обещаний?

Я работаю над приложением Angular 6, и мне сказали, что это антипаттерн:

await someFunction().then(result => {
    console.log(result);
});

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

const result = await someFunction();
console.log(result);

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


  • Я думаю, что await someFunction () верхнего уровня невозможен, он должен быть заключен в какую-то асинхронную функцию или нет? 08.02.2019

Ответы:


1

Под капотом async / await - это просто обещания.

То есть, когда у вас есть код, который выглядит так:

const result = await myAsyncFunction();   
console.log(result): 

Это точно так же, как писать:

myAsyncFunction().then(data => {
   const result = data; 
   console.log(result); 
}); 

Причина в том, что вы не должны смешивать цепочки async / await и .then, в том, что это сбивает с толку.

Лучше просто выбрать один стиль и придерживаться его.

И пока вы выбираете один - вы также можете выбрать async / await - это более понятно.

27.01.2019
  • it's more understandable это 100% мнение. Мне было трудно объяснить некоторым людям, что функция async фактически возвращается вызывающей стороне при первом await выражении. На мой взгляд, одни только обещания требуют меньшего обучения, чем async / await. 27.01.2019
  • на самом деле, я думаю, что первый приведенный выше пример кода неверен, потому что нет вызова await верхнего уровня. Он должен быть заключен в какой-то блок async function (), иначе awai не может быть выполнен, или я ошибаюсь? На мой взгляд, это недостаток async-await ... это немного накладные расходы, imho .. 08.02.2019

  • 2

    Мне сказали, что ожидание цепочки обещаний сломает мой код.

    Не обязательно, что два ваших фрагмента кода действительно работают одинаково (если someFunction() действительно возвращает обещание).

    Какая разница, какой используется. Какие опасности несет первый фрагмент кода, а второй - нет?

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

    Учтите, что вам нужно будет добавить еще один вызов обещания в месте вызова console.log() или даже условный возврат из функции. Можете ли вы использовать await в обратном вызове, как в другом месте функции, нужно ли вам return результат обратного вызова then, возможно ли даже return из внешней функции? Все эти вопросы даже не возникают в первом фрагменте. И хотя на вашем примере с игрушкой на них можно легко ответить, это может быть не так просто в реальном коде с более сложным и вложенным потоком управления.

    Так что лучше отдать предпочтение более лаконичному и чистому. Придерживайтесь await для единообразия, избегайте then в async functions 1.

    1: Конечно, всегда есть исключение из правил. Я бы сказал, что проще использовать цепочку обещаний для обработки ошибок в некоторых случаях, когда вы использовали бы catch или второй then обратный вызов .

    27.01.2019

    3

    Если ваш then код вернул обещание вместо вызова console.log, ваш первый пример будет await, а ваш второй - нет.

    Когда вы используете async/await, вы будете улавливать отказы в try/catch блоках. Ваш код будет менее вложенным и понятным.

    Использование then часто приводит к большей вложенности и затрудняет чтение кода.

    Вы можете await что угодно, независимо от того, возвращает ли он promise. Иногда это оправдывает себя вызовом метода, который однажды может стать асинхронным или просто вернуть обещание без объявления async.

    Минусами являются сложность, производительность и совместимость, которые бледнеют по сравнению с достижениями.

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

    27.01.2019
  • Для объяснения сценария, в котором возникает ошибка, +1. За завершение плохим (не могу сказать, саркастичным?) Советом -1. 27.01.2019
  • Я не понимаю, насколько это саркастично. Вы один из тех async/await ненавистников? Я научил их использовать сотни студентов и НИКОГДА не возвращаюсь. 27.01.2019
  • So decorate your code with await to your heart's delight! очень похоже на то, что он подразумевает использование его, когда в нем нет необходимости, особенно в сочетании с вашим предыдущим утверждением, что вы можете await что угодно. Итак, я должен var foo = await "bar"; только потому, что это действительно так? Может быть, когда-нибудь я заменю эту строку на обещание? Между тем, я должен поместить его в async функцию только потому, что мне хотелось привязать случайное await выражение к чему-то, что соответствует требованиям будущего. Да, я веду себя нелепо, но для меня все равно звучит сарказм, когда я читаю утверждение в конце вашего ответа. 27.01.2019
  • Предлагаю вам поискать определение или сарказм. А пока я поясню, что нужно ждать вызывающих функций, хотя это действительно говорит само за себя. Если вы вызываете foo (), и это не асинхронно, но, возможно, когда-нибудь, ждать этого НЕ ВРЕДА. 27.01.2019
  • Да, есть. Если функция возвращает объект, который определяет then() функцию, awaiting это полностью отличается от returning. Это действительно вредное и несовместимое поведение. 27.01.2019
  • Ваш последний пункт был первой строкой, указанной в моем решении, и именно поэтому использование await имеет преимущество. 27.01.2019
  • foo () синхронизируется, но может когда-нибудь стать асинхронным - это не веская причина использовать await, рассматривая его так, как если бы он уже был асинхронным. Независимо от того, является ли функция асинхронной или нет, это важная часть ее контракта API, и она не должна изменяться случайно. Документируйте, что вы делаете, и держите при этом так. 27.01.2019
  • @bergi Я не согласен на 100% и собираюсь оставить все как есть. 27.01.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..