首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dnode和nowjs有什么区别?

dnode和nowjs有什么区别?
EN

Stack Overflow用户
提问于 2011-03-16 03:58:39
回答 3查看 7.4K关注 0票数 45

这两者之间的对比如何?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-16 11:12:27

TL;DR

DNode

由于arguments;

  • which是完全独立的或通过现有的http服务器实现的,因此
  • 提供了RMI;
  • remote函数可以接受回调,因为它是完全独立的;
  • 可以拥有浏览器和Node http中间件,就像connect;
  • has比NowJS存在的时间更长一样。

NowJS

结论

NowJS现在更像是一个玩具--但在它成熟的时候要留心。对于严肃的事情,也许可以使用DNode。有关这些库的更详细的回顾,请阅读。

DNode

DNode提供了一个远程方法调用框架。客户端和服务器都可以向对方公开函数。

代码语言:javascript
复制
// 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可以用来处理连接相关的事件:

代码语言:javascript
复制
// 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是完全异步的;它在等待远程方法返回时不会阻塞:

代码语言:javascript
复制
// 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
})

必须传递回调,以便从另一个端点接收响应。复杂的对话很快就会变得无法阅读。This question讨论了这个问题的可能解决方案。

代码语言:javascript
复制
// 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客户端可以是在节点实例中运行的脚本,也可以嵌入到网页中。在这种情况下,它将只连接到为网页提供服务的服务器。在这种情况下,Connect提供了很大的帮助。此方案在所有现代浏览器以及Internet Explorer5.5和7上进行了测试。

DNode成立于不到一年前,也就是2010年6月。它已经和Node库一样成熟了。在我的测试中,我没有发现明显的问题。

NowJS

NowJS提供了一种近乎可爱的魔法应用编程接口。服务器具有everyone.now作用域。通过now作用域,每个客户机都可以看到放在everyone.now中的所有内容。

在服务器上,此代码将与每个向服务器控制台写入消息的客户端共享一个echo函数:

代码语言:javascript
复制
// 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属性。

代码语言:javascript
复制
// 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中的函数可以有返回值。要获取它们,必须传递一个回调:

代码语言:javascript
复制
// On the client

now.twice(10, function (r) { console.log(r) }

// On the server

everyone.now.twice = function(n) {
    return 2 * n
}

如果您希望将回调作为诚实的参数传递(而不是收集返回值),这意味着必须始终传递返回值收集器,否则NowJS可能会混淆。根据开发人员的说法,这种通过隐式回调检索返回值的方式可能会在未来发生变化:

代码语言:javascript
复制
// 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
}

这就是NowJS应用编程接口。好吧,实际上还有3个函数可以用来检测客户端的连接和断开。我不知道他们为什么不使用EventEmitter公开这些特性。

与DNode不同,NowJS要求客户端是在web浏览器中运行的脚本。包含脚本的页面必须由运行服务器的同一节点提供服务。

在服务器端,NowJS还需要一个http服务器监听。初始化NowJS时必须传入:

代码语言:javascript
复制
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年3月)。因此,希望它是有buggy的。我在写这个答案的时候发现了issues。也希望它的API会有很大的变化。

积极的一面是,开发人员非常容易接近- Eric甚至指导我让回调工作。源代码没有文档化,但幸运的是,它简单而简短,用户指南和示例足以让你入门。

票数 62
EN

Stack Overflow用户

发布于 2011-03-17 06:21:30

这里是NowJS团队成员。更正andref的答案:

NowJS 完全支持“远程方法调用”。您可以在远程调用中将函数作为参数传递,也可以将函数作为返回值。

这些函数像在DNode中一样由NowJS包装,以便它们在定义函数的机器上执行。这使得向远程端公开新函数变得很容易,就像在DNode中一样。

另外,我不知道andref是否意味着远程调用只在DNode上是异步的。远程调用在NowJS上也是异步的。它们不会阻止你的代码。

票数 14
EN

Stack Overflow用户

发布于 2012-04-26 13:13:02

我没有尝试过Dnode,所以我的答案不是比较。但我想提出一些使用nowjs的经验。

Nowjs是基于socket.io的,这是一个相当多的buggy。我经常遇到会话超时、断开连接和在短时间内多次触发now.ready事件的情况。在nowjs github页面上查看this issue

此外,我发现在某些平台上使用websockets是不可行的,但是可以通过显式禁用websockets来规避这一点。

我曾计划使用nowjs创建一个生产应用程序,但它似乎还不够成熟,无法依赖。如果dnode能满足我的需求,我将尝试它,否则我将切换到普通的express

更新:

现在seems将被报废。自8个月以来没有提交。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5317282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档