Node.js / Express.js - Должен ли я обернуть все свои функции в новое обещание? - PullRequest
0 голосов
/ 21 января 2019

Экспресс-документация Лучшие практики производства: производительность и надежность говорит:

Не использовать синхронные функции

Синхронные функции и методы связывают выполняемый процесс до они вернулись. Один вызов синхронной функции может вернуться в несколько микросекунд или миллисекунд, однако на сайтах с высоким трафиком, эти вызовы складываются и снижают производительность приложения. Избегайте их использовать в производстве.

Итак, мой вопрос в том, что в контексте узла / экспресса, если у меня есть функция, которая принимает некоторое статическое значение и возвращает вычисленный результат (что я обычно считаю «синхронной функцией»), лучше ли оборачивать ее эта функция внутри new Promise и resolve результата или это создает какие-либо существенные ненужные издержки? Например:

Ток:

//inside my index.js
var myArgument = 'some long string';
var myResult = myFunction(myArgument);

function myFunction(myArgument){
  var thisResult;
  //some calculations
  return thisResult;
}

Новое (и улучшенное?)

//inside my index.js
(async function() {
var myArgument = 'some long string';
var myResult = await myFunction(myArgument);
});

function myFunction(url) {
  return new Promise((resolve, reject) => {
    var thisResult;
    //some calculations
    if(thisResult){
      resolve (thisResult);
    } else {
      reject (null)
    }
  });
}

1 Ответ

0 голосов
/ 22 января 2019

Краткий ответ: Нет.

В документации говорится об отсутствии использования синхронных версий функций, таких как readfileSync из файловой системы nodeJS или bcrypt.compareSync, например.Синхронные вызовы блокируют цикл событий в nodeJS.Так что ничего не происходит, пока вы ожидаете завершения синхронного вызова.Вся программа остановлена, пока не закончится этот метод.Это плохо в однопоточной системе, такой как nodeJS.

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

Это просто говорит, что если есть библиотека/ method, который предлагает синхронную версию метода, старайтесь избегать этого метода.

Проверьте: https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/

Выполнение JavaScript в Node.js является однопоточным, поэтому параллелизм относитсяк способности цикла событий выполнять функции обратного вызова JavaScript после завершения другой работы.Любой код, который, как ожидается, будет выполняться одновременно, должен позволять циклу событий продолжаться при выполнении операций не-JavaScript, например операций ввода-вывода.

В качестве примера давайте рассмотрим случай, когда каждый запросдля веб-сервера требуется 50 мс, а 45 мс из этих 50 мс - это ввод-вывод базы данных, который может выполняться асинхронно.Выбор неблокирующих асинхронных операций освобождает 45 мс на запрос для обработки других запросов.Это существенное различие в пропускной способности, если вы выбираете использование неблокирующих методов вместо блокирующих методов.

Цикл обработки событий отличается от моделей во многих других языках, где могут быть созданы дополнительные потоки для одновременной работы.

По поводу дополнительных накладных расходов с упаковкой всего в обещания.Ответ до сих пор нет.

Вы не почувствуете никакой разницы в

function sum(x,y) {
  return x+y
}

const ans = sum(1,2)
console.log(ans) // 3

и

function sum(x,y) {
 return Promise.resolve(x+y) // Shorthand for your new Promise
}

sum(1,2).then(ans => {
  console.log(ans) //3
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...