javascript-dnode和nowjs有什么区别?

两者如何比较?

3个解决方案
61 votes

TL; DR

D节点

  • 提供RMI;
  • 远程函数可以接受回调作为参数;
  • 很好,因为它是完全异步的;
  • 独立运行或通过现有的http服务器运行;
  • 可以具有浏览器和Node客户端;
  • 支持中间件,就像EventEmitter一样;
  • 已经比NowJS长了。

NowJS

  • 不仅限于RMI,还实现了“共享范围” API。 就像是Dropbox,仅包含变量和函数而不是文件;
  • 远程函数还接受回调(感谢NowJS的Sridatta和Eric为了澄清);
  • 依靠监听的http服务器工作;
  • 只能有浏览器客户端;
  • 最近公开;
  • 现在有点越野车。

结论

NowJS现在更像是一个玩具-但随着手表的成熟,请留意。 对于严重的问题,也许与DNode一起使用。 有关这些的更详细的评论库,请继续阅读。

D节点

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!')
})

传递给EventEmitter的函数是一个处理程序,与传递给now。它具有两个参数:now可用于访问客户端和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年6月启动。它与Node一样成熟。库可以。 在测试中,我没有发现明显的问题。

NowJS

NowJS提供了一种神奇的API,与可爱的东西接壤。 服务器有一个EventEmitter范围。 放入now的所有物品都会变成通过其now范围对每个客户可见。

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

// 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.')

运行服务器端“共享”功能时,EventEmitter将具有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
}

如果您想将回调作为诚实的参数传递(不是收集返回值)-必须始终通过返回值收集器,或者NowJS可能会感到困惑。 根据开发商的说法,这种方式带有隐式回调的返回值将来可能会更改:

// 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 API。 好吧,实际上还有3个功能可用于检测客户端连接和断开连接。 我不知道他们为什么但是没有使用EventEmitter公开这些功能。

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

在服务器端,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年3月)。 因此,期望它越野车。 在写此答案时,我自己发现了问题。 还期望它API改变了很多。

从积极的方面来说,开发人员非常容易访问-埃里克(Eric)甚至指导了我使回调起作用。 没有记录源代码,但是幸运的是简单简短,用户指南和示例足以使您入门。

andref answered 2020-07-11T04:41:34Z
14 votes

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

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

这些功能就像在DNode中一样,由NowJS封装,以便在定义该功能的计算机上执行。 就像在DNode中一样,这使得向远程端公开新功能变得容易。

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

Sridatta Thatipamala answered 2020-07-11T04:42:09Z
2 votes

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

Nowjs基于socket.io,这是相当多的错误。 我经常遇到会话超时,断开连接和express事件在短时间内多次触发。 在nowjs github页面上查看此问题。

我也发现在某些平台上使用websockets不可行,但是可以通过显式禁用websockets来避免这种情况。

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

更新:

Nowjs似乎报废了。 自8个月以来没有提交。

Juzer Ali answered 2020-07-11T04:42:52Z
translate from https://stackoverflow.com:/questions/5317282/what-is-the-difference-between-dnode-and-nowjs