Функции обратного вызова или синхронные функции лучше использовать в async / await?
Вы хотите использовать версию функций asyn c, потому что версии syn c блок и не может использоваться асинхронно. (Под "блоком" я подразумеваю, что они вызывают приостановку потока выполнения до тех пор, пока их результат не будет прочитан, поэтому они вообще не являются асинхронными.)
Я считаю, что функции asyn c библиотеки bcrypt - как и многие библиотеки в наши дни - позвольте вам опустить аргумент обратного вызова. Если вы опустите обратный вызов, функции вернут обещание, которое затем можно использовать с await
. Так, например:
const result = await bcrypt.compare(string, hashed)
Здесь функция выполняется асинхронно, но это выглядит как синхронный вызов, потому что вы использовали await
. Если бы вы не использовали await
, вы могли бы использовать Promise напрямую, например:
bcrypt.compare(string, hashed).then(result => console.log(result))
, но await
скрывает Promise от вас и заставляет код выглядеть синхронным.
Технически. обе функции асинхронны
Нет, первая функция не асинхронна. Добавление async
перед функцией просто позволяет вам использовать внутри нее синтаксис await
, но этот первый вариант фактически синхронный. Второй вариант - асинхронный, но вы также не используете async
в этом варианте, потому что вы не используете await
, как в моем примере выше. Вы можете удалить async
из обоих этих вариантов, и ничего не изменится.
но какой из них, по вашему мнению, быстрее?
Они, вероятно, оба такая же скорость, но если вам нужен параллелизм, то есть если у вас есть много запросов, которые должны выполняться одновременно, вам нужно использовать асинхронную c версию вызова, потому что Javascript имеет только один поток, который он делает доступным для ваш код. Поэтому, если вы используете версию syn c, этот поток заблокирует выполнение всех других запросов. Версия asyn c обращается к другим потокам, недоступным для Javascript, и позволяет выполнять множество вычислений bcrypt одновременно.