你如何编写非阻塞模块?

从完全不同的背景来看,Node.js的工作方式对我来说仍然是一个非常陌生的概念。 我正在掌握在你的函数中使用callback的概念 ,但是当我试图支持模块化开发,并因此更好地扩展时,实际上很难实现这一点。

例如,我将如何返回一个函数的结果回到我的代码,或者说,而不是阻止访问? 我一直在阅读,但是我不能把这个事情做完,因为每个人都给我一个不同的答案。 以一个日志function,例如:

exports.log = function (req, res, type) { // do stuff here } 

提前致谢。

 function doStuff (someValue, someOtherValue, someCallBack) { console.log("First Value: " + someValue); while(someValue-- != 0) {console.log(someValue);} someCallBack(someOtherValue); } function delayEventLoopMore(someValue) { while(someValue-- != 0) {console.log('The value:' + someValue);} } doStuff(100000, 100000, delayEventLoopMore); console.log('YAY!'); 

前面的代码是阻止涉及callback的代码的一个例子。 显然简单地提供callback参数并没有使这个代码非阻塞。 如果你运行它,你应该清楚地看到从100,000到0的两个不同的计数,然后打印“YAY”。 如果这个function没有阻塞,我们肯定有足够的时间打印“耶”。 如果你怀疑这可以自由地将价值增加到数百万甚至数十亿。 “耶”将永远是印刷的最后一件事。

真正的asynchronous,非阻塞行为来自V8后端。 复制这个的唯一方法是生成一个本地扩展。

这里有两个版本的这个function:

 exports.log = function (someFileName) { var results; results = fs.readFileSync(someFileName); return results; } exports.log = function (someFileName, callback) { var results; fs.readFile(someFileName, function(data) { results = data;//unnecessary just for clarity! callback(results); } } 

第一个版本假设你所做的任何操作都是同步的。 在这种情况下使用callback绝对没有好处。 只要返回结果。 这将导致事件循环中的延迟量完全相同。 如果您在这里所做的工作非常耗费CPU资源,那么您可能会陷入这种困境。

如果是I / O密集型的,你可以做两件事情之一。 答:利用已经开发的节点模块,它们是Async:http,fs,还有一些很好的mongodb的东西,等等。或者如果你的用例没有任何东西存在,为它开发一个本地扩展。 无论如何,您返回结果的方式是通过用户提供的callback函数,并使用您在asynchronous操作过程中创build的“结果”内容调用此callback函数。