TL; DR
DNode
- обеспечивает RMI;
- удаленные функции могут принимать обратные вызовы в качестве аргументов;
- что приятно, так как оно полностью асинхронное;
- работает автономно или через существующий http-сервер;
- может иметь браузерные и Node-клиенты;
- поддерживает промежуточное ПО, как и
connect
;
- существует дольше, чем NowJS.
NowJS
- выходит за рамки просто RMI и реализует API с «общей областью действия». Это как
Dropbox , только с переменными и функциями вместо файлов;
- удаленные функции также принимают обратные вызовы ( благодаря Sridatta и Эрику из NowJS
для уточнения );
- зависит от работы прослушивающего http-сервера;
- может иметь только браузерные клиенты;
- стал публичным совсем недавно;
- сейчас немного глючит.
Заключение
Сейчас JS больше похожа на игрушку, но следите за ее развитием. За
серьезные вещи, может быть, пойти с DNode. Для более подробного обзора этих
библиотеки, читайте вместе.
DNode
DNode предоставляет инфраструктуру удаленного вызова метода. И клиент, и сервер
могут выставлять функции друг другу.
// On the server
var server = DNode(function () {
this.echo = function (message) {
console.log(message)
}
}).listen(9999)
// On the client
dnode.connect(9999, function (server) {
server.echo('Hello, world!')
})
Функция, переданная в DNode()
, является обработчиком, мало чем отличающимся от функции, переданной в
http.createServer
. Он имеет два параметра: client
может использоваться для доступа к
функции, экспортируемые клиентом, и connection
могут использоваться для обработки
события, связанные с подключением:
// On the server
var server = DNode(function (client, connection) {
this.echo = function (message) {
console.log(message)
connection.on('end', function () {
console.log('The connection %s ended.', conn.id)
})
}
}).listen(9999)
Экспортированным методам можно передавать что угодно, включая функции. Они правильно
DNode упакован в качестве прокси и может быть вызван обратно на другой конечной точке. Это
фундаментальный: DNode полностью асинхронный; не блокируется во время ожидания
для удаленного метода вернуть:
// A contrived example, of course.
// On the server
var server = DNode(function (client) {
this.echo = function (message) {
console.log(message)
return 'Hello you too.'
}
}).listen(9999)
// On the client
dnode.connect(9999, function (server) {
var ret = server.echo('Hello, world!')
console.log(ret) // This won't work
})
Обратные вызовы должны передаваться для получения ответов от других
конечная точка. Сложные разговоры могут стать нечитаемыми довольно быстро. Это
Вопрос обсуждает возможные решения этой проблемы.
// On the server
var server = DNode(function (client, callback) {
this.echo = function (message, callback) {
console.log(message)
callback('Hello you too.')
}
this.hello = function (callback) {
callback('Hello, world!')
}
}).listen(9999)
// On the client
dnode.connect(9999, function (server) {
server.echo("I can't have enough nesting with DNode!", function (response) {
console.log(response)
server.hello(function (greeting) {
console.log(greeting)
})
})
})
Клиент DNode может быть скриптом, работающим внутри экземпляра Node, или может быть
встроенный в веб-страницу. В этом случае он будет подключаться только к серверу, который
обслуживал веб-страницу. Connect очень помогает в этом случае. Этот сценарий был протестирован во всех современных браузерах и с Internet Explorer 5.5 и 7.
DNode был запущен меньше года назад, в июне 2010 года. Он так же зрел, как и узел
библиотека может быть. В моих тестах я не обнаружил очевидных проблем.
NowJS
NowJS предоставляет своего рода волшебный API, который граничит с симпатичностью. Сервер имеет
everyone.now
сфера. Все, что помещено внутрь everyone.now
, становится
видна каждому клиенту через область действия now
.
Этот код на сервере будет использовать функцию echo
для каждого клиента, который
пишет сообщение на консоль сервера:
// Server-side:
everyone.now.echo = function (message) {
console.log(message)
}
// So, on the client, one can write:
now.echo('This will be printed on the server console.')
При запуске «разделяемой» функции на стороне сервера this
будет иметь атрибут now
это характерно для клиента, который сделал этот вызов.
// Client-side
now.receiveResponse = function (response) {
console.log('The server said: %s')
}
// We just touched "now" above and it must be synchronized
// with the server. Will things happen as we expect? Since
// the code is not multithreaded and NowJS talks through TCP,
// the synchronizing message will get to the server first.
// I still feel nervous about it, though.
now.echo('This will be printed on the server console.')
// Server-side:
everyone.now.echo = function (message) {
console.log(message)
this.now.receiveResponse('Thank you for using the "echo" service.')
}
Функции в NowJS могут иметь возвращаемые значения. Чтобы получить их, обратный звонок должен быть
прошло:
// On the client
now.twice(10, function (r) { console.log(r) }
// On the server
everyone.now.twice = function(n) {
return 2 * n
}
Это имеет значение, если вы хотите передать обратный вызов в качестве честного аргумента (не
собирать возвращаемое значение) - нужно всегда проходить сборщик возвращаемого значения, или
Теперь JS может запутаться. По словам разработчиков, этот способ получения
возвращаемое значение с неявным обратным вызовом, вероятно, изменится в будущем:
// On the client
now.crunchSomeNumbers('compute-primes',
/* This will be called when our prime numbers are ready to be used. */
function (data) { /* process the data */ },
/* This will be called when the server function returns. Even if we
didn't care about our place in the queue, we'd have to add at least
an empty function. */
function (queueLength) { alert('You are number ' + queueLength + ' on the queue.') }
)
// On the server
everyone.now.crunchSomeNumbers = function(task, dataCallback) {
superComputer.enqueueTask(task, dataCallback)
return superComputer.queueLength
}
И это для API NowJS. Ну, на самом деле есть еще 3 функции, которые
может использоваться для обнаружения клиентского подключения и отключения. Я не знаю почему они
однако не раскрывал эти функции с помощью EventEmitter
.
В отличие от DNode, NowJS требует, чтобы клиент был скриптом, работающим внутри веб-браузера.
Страница, содержащая скрипт, должна обслуживаться тем же узлом, на котором выполняется
сервер.
На стороне сервера NowJS также требуется прослушивание http-сервера. Это должно быть передано
при инициализации NowJS:
var server = http.createServer(function (req, response) {
fs.readFile(__dirname + '/now-client.html', function (err, data) {
response.writeHead(200, {'Content-Type':'text/html'})
response.write(data)
response.end()
})
})
server.listen(8080)
var everyone = now.initialize(server)
NowJS первый коммит произошел пару недель назад (март 2011). Таким образом, ожидайте, что это
быть багги Я нашел проблем сам во время написания этого ответа. Также ожидайте его
API сильно изменился.
С положительной стороны, разработчики очень доступны - Эрик даже наставил меня
чтобы заставить работать обратные вызовы. Исходный код не задокументирован, но к счастью
просто и кратко, и руководство пользователя и примеры достаточно, чтобы начать.