如何编写非阻塞模块
How do you write non-blocking modules?
来自一个完全不同的背景,Node.js的工作方式对我来说仍然是一个非常陌生的概念。我正在掌握在函数中使用回调的概念,但当我试图支持模块化开发并因此实现更好的扩展时,我很难将其付诸实践。
例如,我如何将函数的结果返回到我的代码中,或者更确切地说,在不阻塞的情况下访问?我一直在读这篇文章,但我无法理解这是如何实现的,因为每个人都在给我一个不同的答案。以日志函数为例:
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!');
前面的代码是一个涉及回调的阻塞代码示例。显然,简单地提供回调参数并不能使此代码成为非阻塞代码。如果你运行它,你应该清楚地看到从100000到0的两个不同的计数,然后最后打印"YAY"。如果这个功能是非阻塞的,我们肯定会有足够的时间打印"Yay"。如果你对此表示怀疑,可以随意将价值提高到数百万甚至数十亿。"耶"永远是最后印出来的。
真正的异步、非阻塞行为来自V8后端。复制这一点的唯一方法是生成一个本机扩展。
以下是该功能的两个版本:
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);
}
}
第一个版本假设您正在执行的任何操作都是同步的。在这种情况下使用回调绝对没有任何好处。只需返回结果即可。无论哪种方式,它都将导致事件循环中完全相同的延迟量。如果你在这里必须做的工作是非常耗费CPU的,那么你可能会陷入这种困境。
如果是I/O密集型,您可以执行以下两项操作之一。A: 利用已经开发的异步节点模块:http,fs,有一些好的mongodb东西,等等…或者,如果你的用例不存在任何东西,就为它开发一个本地扩展。无论如何,返回结果的方式是,通过回调用户提供给你的,并使用您在异步操作过程中建立的"results"的内容调用此回调。
相关文章:
- 编写在浏览器和node.js中运行的模块化ECMAScript
- 模块化&重用使用ExtJS编写的代码
- 如何正确编写与蓝鸟的“PromisifyAll”兼容的模块
- 如何使用 sinon.stub 编写单元测试以“请求”节点模块
- 编写可重用的javascript模块和库
- 如何编写 Node.js 模块来处理传入的管道流
- 如何模块化地编写JavaScript
- 需要用coffeescript编写的节点模块
- 如何编写非阻塞模块
- 为创建Json REST服务的模块编写单元测试
- 如何在angular.js中分别编写控制器、服务、路由和模块
- 使用webpack's require为javascript模块编写测试.确保功能
- 手动调用模块与使用browserify动态调用模块有何不同?
- 如何更模块化地编写jQuery代码
- 如何用Babel在ES6中编写一个与CommonJS、AMD和Browser兼容的模块?
- 编写与客户端javascript和服务器端NodeJs模块一起工作的javascript代码
- 如何为模块编写Typescript类定义
- JavaScript模块模式以两种不同的方式编写,结果相同
- 为javascript节点模块编写git API
- 在AMD javascript模块中编写多个函数