Подтвердить что ты не робот

Синхронный асинхронный код с Node.js

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

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

Одна вещь, которая поляризовала нас, - это лучшее время для использования синхронного кода с асинхронным кодом. В настоящее время мы используем правило, которое, если что-либо взаимодействует с IO, тогда оно должно быть асинхронным с помощью обратных вызовов или эмиттера событий (это заданный), но другие элементы, которые никоим образом не могут использоваться с IO, могут быть сконструированы как синхронные функции (это зависит также от тяжести самой функции и от ее блокировки), но лучший ли это подход при работе с Node.js?

Например, мы создаем построитель Hal + JSON, который в настоящее время существует в нашей базе кода. Это синхронно просто потому, что все, что он делает, создает некоторые довольно мелкие объектные литералы и ничего больше, нет внешних зависимостей и, конечно же, не имеет взаимодействия с IO.

Является ли наш подход хорошим или нет?

4b9b3361

Ответ 1

Скажем, у вас есть две функции: foo и bar, которые выполняются синхронно:

function foo() {
    var returnValue = bar();
    console.log(returnValue);
}

function bar() {
    return "bar";
}

Чтобы сделать API асинхронным, необходимо изменить его для использования обратных вызовов:

function foo() {
    bar(function(returnValue) {
        console.log(returnValue);
    });
}

function bar(callback) {
    callback("bar");
}

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

Затем он становится вопросом о удобочитаемости кода и стиле кодирования. Я лично считаю типичный код типа var val = func(); более понятным и понятным. Единственным недостатком является то, что если вам когда-нибудь понадобится изменить функциональность bar, так что ему нужно будет выполнить некоторые операции ввода-вывода или вызвать какую-то другую функцию, которая является асинхронной, вам необходимо изменить API bar.

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

Ответ 2

Включение синхронной функции в асинхронную с использованием process.nextTick() - это опция, но вы должны использовать ее только в том случае, если ваше программное обеспечение слишком долго блокируется. Каждый раз, когда ваша синхронная функция работает node, она не может делать ничего, кроме одиночной. Это означает, что если ваше приложение является сервером, оно становится невосприимчивым.

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

См. здесь для хорошего обсуждения https://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil

Здесь вы можете сделать свою функцию асинхронной, в том смысле, что вы разрешите node делать другие вещи http://howtonode.org/understanding-process-next-tick

Ответ 3

Я не знаю, что "Hal + Json builder", но вот что я думаю о NodeJS. Вы должны написать свой код как можно более асинхронный, подталкивая его к нему. Простая причина заключается в том, что асинхронный код обрабатывает производительность для реагирования, что в большинстве случаев более важно.

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

var arr = []; // assume array is nonempty
for (var i = 0, l = arr.length; i < l; i++) {
    arr[ i ].doStuff( );
}

Если arr невелик и doStuff является быстрой операцией, вы не должны беспокоиться о написании этого кода асинхронным способом. Однако, если это занимает некоторое время, вам следует подумать о том, чтобы написать его так:

var arr = []; // assume array is nonempty
var process_array_element = function( ) {
    if (arr.length) {
        arr.pop().doStuff( );
        process.nextTick( process_array_element );
    }
};
process_array_element( );

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

Вывод: Это зависит от вашей ситуации!:)