NodeJS: функции обратного вызова или синхронные функции лучше использовать в async / await? - PullRequest
2 голосов
/ 01 августа 2020

Я сейчас нахожусь в процессе преобразования некоторых зависимостей моего проекта в их собственные функции asyn c / await для улучшения процесса разработки. Многие из этих зависимостей, такие как bcrypt, имеют параметры для использования синхронных (без обратного вызова) функций или асинхронных (обратных вызовов) функций. Я создал сверхмалую функцию, которая преобразует вывод bcrypt по сравнению с моей версией, удобной для фреймворка, которая всегда возвращает объект {success: true / false, result}. Вот пример того, что у меня есть.

      async hashStringCompare (hashed, string) {
        try {
          const success = bcrypt.compareSync(string, hashed)
          if (!success) return {msg: 'The string does not match', success}
          return {msg: 'The string does match', success}
        } catch (err) {
          return {err, msg: 'Something bad happened', success: false}
        }
      },
    

Проблема в том, что bcrypt предлагает две функции для сравнения строк и хешированных строк; compareSyn c и сравнивать. Если бы я отформатировал код для использования функции сравнения, использующей обратные вызовы, он бы выглядел так:

       async hashStringCompare (hashed, string) {
         return new Promise((resolve) => {
           bcrypt.compare(string, hashed, (err, success) => {
             if (err) resolve({ err, msg: 'An error has occured.', success })
             resolve({success, msg: 'The string does match' })
           })
         })
        }

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

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

Спасибо, что нашли время, чтобы прочитать это. Буду очень признателен за любой совет, который у вас может быть.

1 Ответ

2 голосов
/ 01 августа 2020

Функции обратного вызова или синхронные функции лучше использовать в 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 одновременно.

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