|
|
|
Попробуй систему в действии, бесплатно и быстро. |
|
|
|
|
|
|
|
|
|
Бесплатная регистрация в трастовых каталогах и досках обьявлений. |
|
|
|
|
|
|
|
|
|
Добавь бесплатно сайт в 211 поисковые системы. Ru, Eng, Fra, Esp, Ukr. |
|
|
|
|
|
|
 |
|
Файл Jade-шаблона для вывода пяти наивысших результатов
doctype 5
html(lang="en")
head
title Zowie! Top Scores
meta(charset="utf-8")
| <-- style type="text/css">
include main.css
| <--/style> body
table
caption Zowie! Top Scorers!
tr
th Score
th Name
th Date
if scores.length
each score in scores
if score
tr
td #{score.score}
td #{score.first_name} #{score.last_name}
td #{score.date}
Для визуализации шаблона приложение читает файл шаблона (в синхронном режиме, поскольку это происходит только единожды при первом запуске приложения), а затем использует его для компилирования функции шаблона:
var layout = require('fs').readFileSync(__dirname + '/score.jade', 'utf8');
var fn = jade.compile(layout, {filename: __dirname + '/score.jade'});
Далее Jade-функция компилирования может использоваться в любой момент, когда потребуется визуализировать HTML-разметку из шаблона, с передачей ей тех данных, которые ожидаются шаблоном:
var str = fn({scores : result});
res.end(str);
Смысл всего этого станет понятен, когда мы увидим готовое серверное приложение, а теперь давайте вернемся к Redis-части приложения. В приложении наивысших результатов используются два Redis-вызова: zrevrange служит для получения диапазона показателей, а hgetall — для получения всех хэш-полей каждого игрока, упомянутого в наивысших показателях. И здесь все немного усложняется.
В реляционной базе данных объединение результатов из нескольких таблиц не составляет никакого труда, но в отношении доступа к данным в таком хранилище данных, как Redis, все обстоит иначе. Задача может быть решена, но так как мы имеем дело с Node-приложением, у нас возникают дополнительные сложности в придании каждому Redis-вызову асинхронного характера.
Здесь нам пригодится библиотека Async, которая рассматривалась в главе 5, где были продемонстрированы два Async-метода: waterfall и parallel. Одним из не продемонстрированных там методов является series, который идеально подходит для нашего случая. Redis-функции нужно вызывать по очереди, чтобы данные возвращались по очереди, но каждому промежуточному шагу не требуются данные предыдущих шагов. Функция parallel библиотеки Async позволяет инициировать все вызовы одновременно, что нам вполне подходит, но результаты каждого вызова возвращаются в случайном порядке, что не гарантирует возвращение наивысшего показателя первым. Функция waterfall нам не нужна, поскольку опять же каждый шаг не нуждается в данных предыдущего шага. Async-функция series гарантирует, что все вызовы Redis-метода hgetall делаются последовательно и данные возвращаются последовательно, но при этом берется в расчет, что каждый функциональный шаг не зависит от других.
Итак, теперь у нас есть способ вызова Redis-команд по очереди с гарантией, что данные будут возвращены в нужной последовательности, но код для решения этой задачи довольно грубый: нам приходится добавлять отдельный шаг в Async-мето де series для каждого вызова Redis-метода hgetall и возвращать результат, как только будет возвращен каждый показатель. Когда требуется получить 5 значений, проблем не возникает, но что если понадобится вернуть 10 или 100 значений? Необходимость вручную вводить код для каждого Redis-вызова в Async-метод series будет становиться все более утомительной, что может привести к ошибкам в коде и к сложностям в его поддержании.
Приложение наивысших результатов обеспечивает последовательный перебор значений массива, возвращенных вызовом Redis-метода zrevrange, передавая каждое значение в качестве параметра функции по имени makeCallbackFunc. Эта вспомогательная функция занята только лишь возвращением функции обратного вызова, которая инициирует вызов Redis-метода hgetall, используя параметр для получения данных конкретного игрока, а затем обращается к функции обратного вызова в последней строке своего обратного вызова — это требование Async, чтобы была возможность выстраивания результатов в цепочку. Функция обратного вызова, возвращенная из makeCallbackFunc, помещается в массив, и это именно тот массив, который отправляется в качестве параметра Async-методу series. Кроме того, поскольку модуль redis возвращает результат вызова метода hgetall в виде объекта, а Async-метод series, завершая свою работу, вставляет каждый объект в массив, то когда вся эта функциональность оказывается реализованной, мы можем просто взять конечный результат и передать его в движок шаблонов, чтобы сгенерировать текст для возвращения на сервер.
В листинге показан весь код серверного приложения наивысших результатов. Хотя, казалось бы, проделан довольно большой объем работы, благодаря элегантности и удобству модулей Redis и Async кода получилось совсем не много.
Для того чтобы сайт был всегда в ТОП выдачи не обязательно платить и переплачивать, достаточно добавить сайт Добавить сайт бесплатно в трастовые каталоги в белые каталоги для быстрой индексации в поисковых системах, в специально написанном бесплатном модуле.
Если Вам был полезен этот материал и Вы бы хотели сохранить ссылку на своём сайте, просто скопируйте и установите этот баннер на сайте. Мы будем очень признательны.
Пример баннера
 |
Скопируйте код на свой сайт
|
|