Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.05.2014, 12:31
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Как вы пишете на сервере (node.js)
Много информации по написанию на node.js. Но чем больше ее изучаешь, тем понимаешь, что строгого подхода к написанию кода в node.js нет.

В этой теме хотелось бы понять при каких обстоятельствах использовать функции обратного вызова и события в node.js


Когда-то можно и не прерывать процесс. Запросили данные, подождали, получили.

Когда-то нужно с вызовом передать функцию обратного вызова (callback). И на другом конце обернуть ее process.nextTick()

Наверное кто-то весь код "склеивает" событиями eventEmitter.


Поделитесь опытом в каких случаях какие подходы задействуете.


Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 12.05.2014, 13:00
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Главные правила ноды (из личного опыта, примерно ~ 2 года работы с нодой):

1) Не бросай исключений в асинхронных операциях, а передавай их как параметр callback;

2) Используй паттерны / фреймворки для работы с асинхронностью. Выбор фреймворка и паттерна зависит от предпочтений, я использую Async.

3) Нельзя по долгу занимать поток в серверном приложении, т.е. если нужно что-то большое посчитать, то либо используй setImmediate и дроби задачу, либо выноси задачу из Ноды на более предпочтительный инструмент (имхо, более правильное решение).

Всё остальное уже не так важно, т.е. пиши как нравиться.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 12.05.2014 в 13:16.
Ответить с цитированием
  #3 (permalink)  
Старый 12.05.2014, 13:48
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от kobezzza
3) Нельзя по долгу занимать поток в серверном приложении, т.е. если нужно что-то большое посчитать, то либо используй setImmediate и дроби задачу, либо выноси задачу из Ноды на более предпочтительный инструмент (имхо, более правильное решение).
Все руки не доходят проверить, если написать модуль для ноды на c++, и в нем провести расчеты, то нода блокироваться не будет, а задача будет выполненна асинхронно ?
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #4 (permalink)  
Старый 12.05.2014, 13:54
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
Все руки не доходят проверить, если написать модуль для ноды на c++, и в нем провести расчеты, то нода блокироваться не будет, а задача будет выполненна асинхронно ?
Подозреваю, что это зависит от того, как написано дополнение, ведь для интеграции С/С++ кода как модулей ноды там есть своё АПИ, которое можно юзать и думаю, что есть возможность "фризить" поток выполнения ноды, если это нужно.

Но на самом деле не важно на чём писать. Я обычно юзаю простую связку через REST, т.к. эту схему элементарно масштабировать и легко понять.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 12.05.2014 в 13:59.
Ответить с цитированием
  #5 (permalink)  
Старый 12.05.2014, 13:58
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

kobezzza, а можешь дать пример кода, если не тяжело .
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #6 (permalink)  
Старый 12.05.2014, 14:05
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

У тебя есть:

1) Кластер серверов на ноде, который принимает и агрегирует входящие запросы от клиентов;

2) Кластер серверов на Java/C++/Erlang и т.д., которые делают какие то жёсткие вычисления в 100500 потоков и т.д.

Нужно организовать общение двух этих кластеров: берём банальный REST. В качестве транспорта можно взять тот же HTTP, организуем понятный для обоих сторон протокол и вуаля.

Собственно по ссылке на википедии дан исчерпывающий ответ:

Цитата:
Данные в REST должны передаваться в виде небольшого количества стандартных форматов (например HTML, XML, JSON). Сетевой протокол (как и HTTP) должен поддерживать кэширование, не должен зависеть от сетевого слоя, не должен сохранять информацию о состоянии между парами «запрос-ответ». Утверждается, что такой подход обеспечивает масштабируемость системы и позволяет ей эволюционировать с новыми требованиями.

Антиподом REST является подход, основанный на вызове удаленных процедур (Remote Procedure Call — RPC). Подход RPC позволяет использовать небольшое количество сетевых ресурсов с большим количеством методов и сложным протоколом. При подходе REST количество методов и сложность протокола строго ограничены, из-за чего количество отдельных ресурсов может быть большим.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 12.05.2014 в 14:08.
Ответить с цитированием
  #7 (permalink)  
Старый 12.05.2014, 14:11
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от kobezzza
Собственно по ссылке на википедии дан исчерпывающий ответ:
Без твоего добавления по написаному , не совсем понятно как это работает .
спасибо.
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #8 (permalink)  
Старый 12.05.2014, 19:04
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от dmitry111
Много информации по написанию на node.js. Но чем больше ее изучаешь, тем понимаешь, что строгого подхода к написанию кода в node.js нет.
его вообще нет.

кстати, что ты имеешь в виду под "node.js" ? веб-сервер? так это ж только один компонент node.js

наверное ты имел в виду express\connect

я тоже долго допирал до того, как можно организовать код, чтобы вручную не прописывать route'инги, ибо это ну очень меня выматывает.

решение оказалось простым - это было Ruby on Rails SailsJS. сначала показалось, что это закос под Yii, но потом меня одёрнуло, и я вспомнил, что Yii - это тоже закос под ROR

Сообщение от dmitry111
В этой теме хотелось бы понять при каких обстоятельствах использовать функции обратного вызова и события в node.js
имхо, ответ дан на главной странице Node.js :


я хочу сказать - ответ "везде, где есть ввод\вывод". но это я так думаю

Сообщение от kobezzza
1) Не бросай исключений в асинхронных операциях, а передавай их как параметр callback;
причём как первый параметр callback
kobezzza, а почему стали делать именно так ?

Сообщение от kobezzza
2) Используй паттерны / фреймворки для работы с асинхронностью. Выбор фреймворка и паттерна зависит от предпочтений, я использую Async.
скоро будем использовать co и yield
Ответить с цитированием
  #9 (permalink)  
Старый 12.05.2014, 21:17
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
а почему стали делать именно так ?
Потому что это удобнее, чем плясать с доменами и "нативно" с точки зрения самой ноды.

Или если рассматривать yield подход, то использование try-catch тоже не шибко нравиться, т.к. синтаксис конструкции слишком громоздкий и цена за её использование высока.

Может я что-то не понимаю в этой жизни, но на мой взгяд это супер очевидно и удобно
async.map(['file1', 'file2', 'file3'], fs.stat, function (err, results) {
    ...
});

async.parallel(
    [
        function () { ... },
        function () { ... }
    ], 

    function (err, results) {
        ...
    }
);


Цитата:
скоро будем использовать co и yield
Я пока не вижу очевидных плюсов подхода с yield, как замены async, так что с переходом повременю.

А вот использование генераторов в других задачах я принял с восторгом и уже активно юзаю на сервере, собственно по этому я сейчас тружусь над новой версией Collection с поддержкой генераторов.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 12.05.2014 в 21:22.
Ответить с цитированием
  #10 (permalink)  
Старый 12.05.2014, 21:25
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от melky
Сообщение от kobezzza
1) Не бросай исключений в асинхронных операциях, а передавай их как параметр callback;
причём как первый параметр callback
kobezzza, а почему стали делать именно так ?
Это даже не рекомендация, а обязательное правило, потому что catch может поймать только исключение в своем стеке.
try {
    setImmediate(function () {
        throw new Error('test error');
    });
} catch (error) {
    console.log(error); //не поймает test error
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
как можно зашифровать ссылку на сервере апече? olehpdatu Серверные языки и технологии 1 22.04.2013 11:51
Недопонимание философии Node.js Voronar AJAX и COMET 10 25.02.2013 14:00
Как сохранять данные на сервере по средствам <form>? goshikvia Общие вопросы Javascript 1 26.03.2009 14:06