Comments 31
Какой исходных код этих ф-ций get_profile и get_msgs?
Согласно вашему прошлому топику он достаточно страшный…
parallel([
get_profile(user),
get_msgs(user)
]).
Согласно вашему прошлому топику он достаточно страшный…
+2
возможно get_profile выглядела бы так:
function get_profile(user){
var d = Deferred();
if (!conn.connected()) {
d.fail("Connection error " + conn.connectErrno + ": " + conn.connectError);
}else{
conn.query("SELECT * FROM users where user="+user, function (err, res){
if (err) {
d.fail(err);
}else{
d.call(res.fetchFirst())
}
})
}
return d;
}
0
да, не очень красиво.
-2
Нееее, если уж делать врап, то он должен быть сам по себе, без диких конструкций внутри.
не совсем понимаю зачем делать обьект Deffered в таком виде, если можно снаружи легко проверить instanceof?
не совсем понимаю зачем делать обьект Deffered в таком виде, если можно снаружи легко проверить instanceof?
+1
Если предварительно сделать врап для объекта conn, то получится
function get_profile(user){
var d = Deferred();
conn.query("SELECT * FROM users where user="+user)
.error(function(e){d.fail(e)})
.next(function(data){d.call(data)});
return d;
}
0
коли уж conn.query() возвращает deferred, то должно быть так:
function get_profile(user){
return conn.query("SELECT * FROM users where user="+user)
.error(function(e){d.fail(e)})
.next(function(data){d.call(data)});
}
0
Ну вот. А теперь напишем функцию, которая будет делать врап за вас.
Вот это прибилизтельно то, что я делаю =)
// simplified
function wrap (fn) {
return function () {
var d = Deferred();
fn();
return d;
}
}
Вот это прибилизтельно то, что я делаю =)
-2
Мне лично кажется что в случае большой вложенности нужно ее уменьшать: это узкое место, не проще на сервере собрать один готовый объект и прислать его? Т.е. в первом случае вернуть объект user, в котором есть профиль, сообщения, последние комменты и тд. Зачем столько раз обращаться с запросами к серверу, если нет никакой зависимости между этими сущностями? Запрашиваем: верни user с комментами и профилем, сервер формирует одним json объектом ответ, нужен только профиль, пожалуйста.
0
а что, если это асинхронный запрос к бд?
+1
Вы видимо про серверный js говорите, тогда посоветую использовать синхронный коннектор к базе) Либо библиотеку step https://github.com/creationix/step
-1
синхронный на node.js? зачем?
+1
во первых параллельная организация работы все равно решается с помощью воркеров, подключение к базе и отключение, имхо, должно быть синхронным. Время затраченное на подключение к локальной базе ничтожно, и вешать обработчик на это глупо — он лишь запутывает код. А вот запросы можно дергать как синхронно, так и асинхронно. Все зависит от времени и места.
-2
подключение к базе осуществляется один раз при старте сервера (ну или несколько раз).
а запросы выполняются много раз и, я так понял, должны быть асинхронными
а запросы выполняются много раз и, я так понял, должны быть асинхронными
0
Все зависит от стиля программирования и решаемой проблемы. Я считаю что злоупотребление такими обертками подталкивает программиста к процедурному стилю. Как и излишняя вложенность калбеков, если такое присутствует, надо получше продумывать архитектуру приложения\класса. К вопросу о синхронности запросов: Если от какого-то запроса зависит дальнейшая работа приложения (например логин к системе), но асинхронность тут не нужна. Если это обновление какких-то данных, то однозначно асинхронность. Если это сохранение: тут спорно, кто-то блокирует работу пока оно не завершится, кто-то сохраняет на лету… каждый случай требует своего решения
0
странно. казалось бы, при чём тут такие обёртки к стилю программирования. что говнокод, что хороший код можно написать и с асинхронным подходом и с синхронным.
+1
Слово «подталкивает» ключевое. Говнокод и процедурный стиль это разные вещи. А зачем забивать все одним микроскопом, если можно пользоваться двумя?=) Я считаю не нужно уходить в секту синхронности или асинхронности, всему свое место. Если у вас логин блокирует всю программу, то зачем точку входа запихивать в калбек, это не наглядно. Хотя личное дело каждого)
0
А что, если это на сервере выполняется? :-)
+2
Ну что вы все время пару решений мусолите?
Подумали бы лучше как заврапить типичную проблему для формы:
есть поле, которое верифицируется аяксом и есть сабмит формы, которое требует верифицированного поля
обычно вешается на blur поля запрос, но некоторые браузеры подставляют значение в поле, так что неплохо бы верифицировать непустое поле на сабмите.
В результате на сабмите пара флагов на верификацию ( старт, успешно), а в запросах на последнюю флаг на сабмит формы ( что бы таки сделать сабмит если верификация прошла ).
Что происходит если таких полей в форме несколько представить можно, но страшно :)
Подумали бы лучше как заврапить типичную проблему для формы:
есть поле, которое верифицируется аяксом и есть сабмит формы, которое требует верифицированного поля
обычно вешается на blur поля запрос, но некоторые браузеры подставляют значение в поле, так что неплохо бы верифицировать непустое поле на сабмите.
В результате на сабмите пара флагов на верификацию ( старт, успешно), а в запросах на последнюю флаг на сабмит формы ( что бы таки сделать сабмит если верификация прошла ).
Что происходит если таких полей в форме несколько представить можно, но страшно :)
+2
если обработчик упадёт с исключением — фейл будет вызван или мы так и не узнаем, что всё упало?
0
точнее jsfiddle.net/FZqZN/3716/
-1
Sign up to leave a comment.
Асинхронная синхронность. JSDeferred