Есть ли основания предпочитать асин c версии функций в node.js при вызове их из асин c функции? - PullRequest
2 голосов
/ 21 февраля 2020

В основном, глядя на API FS, кажется, что для большинства функций есть три варианта:

  1. Синхронный
  2. Асинхронный с обратным вызовом
  3. Асинхронный с использованием Обещания

Asyn c - превосходный способ использовать системные ресурсы, однако, если я уже нахожусь внутри функции asyn c и все равно жду каждого вызова, тогда не должно быть никаких Разница между этим и просто с помощью синхронных вызовов, верно? Для меня это только выглядит как встроенный оператор await.

Я не знаю, как asyn c реализован в js / node. Есть ли какое-то преимущество в использовании функций asyn c, если я нахожусь внутри функции asyn c для начала? (исключая сценарий ios при параллельном выполнении асин c задач)

Ответы [ 2 ]

3 голосов
/ 21 февраля 2020

Следует решить использовать функцию async ТОЛЬКО на основе того, что происходит внутри этой функции, а не от того, кто ее вызывает. Вызывающая сторона не влияет на то, должна ли функция быть async или нет.

Причины сделать функцию async:

  1. В функции есть асинхронные операции на основе обещаний внутри функции и вы sh будете использовать await.
  2. У вас есть асинхронные операции на основе обещаний внутри функции, и вы sh воспользуетесь автоматическим c перехватом синхронных исключений (и преобразованием) к отклоненному обещанию), которое может произойти до того, как вы вызовете свои асинхронные операции.

И это в значительной степени объясняется причинами использования ключевого слова async перед функцией.

То, что функция async НЕ является (или распространенное заблуждение относительно функций async):

  1. Магическим образом код блокировки не становится неблокирующим.
  2. Это не заставляет звонящего работать быстрее.
  3. Это не заставляет синхронный код теперь работать в фоновом режиме асинхронно.

Asyn c - лучший способ T o использовать системные ресурсы,

Не уверен, что вы там имеете в виду. Асинхронные функции позволяют запускать операции неблокирующим образом, чтобы основной поток в Javascript мог выполнять другие действия во время выполнения асинхронной операции, но это не то, что разрешает функция async. Это включается асинхронной операцией. Они разные.

Если я уже нахожусь внутри функции asyn c и все равно жду каждого вызова, тогда не должно быть никакой разницы между этим и просто использованием синхронных вызовов, верно?

Неправильно. Использование await с функцией, которая возвращает обещание, приостанавливает выполнение текущей функции (немедленно возвращает обещание), но это позволяет основному потоку Javascript выполнять другие действия, обслуживать другие запросы и т. Д. c ... Использование синхронного кода блокировало бы и не позволяло бы основному потоку делать другие вещи, тем самым разрушая масштабируемость сервера.

Мне это только кажется встроенным оператором ожидания.

Блокировка, синхронный код влияет на все остальное, что может быть запущено во время вашей работы. Это не то же самое, что использование await.

1 голос
/ 21 февраля 2020

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

async помещает задачу в событие l oop, которая будет выполняться после завершения всего ожидающего синхронного выполнения в стеке. Преимущества этого очевидны: процесс может выполнять работу, ожидая доступности ресурсов (например, для открытия файла требуется системный вызов, поэтому имеет смысл сделать эту операцию неблокирующей).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...