- 浏览: 96750 次
- 性别:
- 来自: 临沂
文章分类
- 全部博客 (125)
- spring (2)
- java (6)
- jquery (0)
- android (0)
- window (1)
- 数据库 (0)
- 项目管理 (1)
- maven (0)
- english (0)
- ext (0)
- javascript and html (2)
- hibernate (1)
- p6spy (0)
- shiro (0)
- fusionchart (0)
- FileUtils (0)
- struts2 (0)
- ireport (0)
- webservice (0)
- stripes (0)
- jsp (1)
- it综合 (1)
- linux (1)
- 工作流 (0)
- activiti (0)
- poi (0)
- nosql (0)
- mongodb (0)
- lucene (0)
- nodejs (10)
- eclipse (2)
- objective-c (1)
最新评论
本文是对nodejs0.8.9版本的api开发手册解读.nodejs网址
域(Domain)
stability:1 - experimental
域提供了一种简单把多个不同的io操作看作一个单独的组的方法.如果任何一个事件发射器或者已在域中注册的回调函数发出了一个error事件,或者抛出一个error错误信息,域将会被通知,而不是在process.on('caughtException')处理函数一样丢失上下文,或者用一个code引起程序退出.(有点像数据库的事物的样子)
这是在node0.8版本中新增加的特性.这是它第一次亮相,其他它能在未来有更重要的作用.请使用它,并提供使用反馈.
由于它的试验性质,域的特性只有在domain模块加载一次以后才会生效.没有域是默认被创建或者注册的.这是故意设计成这样的,为了避免在现在的程序中产生一些不利的影响.在未来node的版本中期待改成默认启用.
错误对象的补充(additions to Error objects)
任何时候一个error对象被路由传递到一个domain(域看着别扭)中时,需要添加一些额外的字段到error对象上.
error.domain
The domain that first handled the error.第一次处理error的domain对象error.domain_emitter
The event emitter that emitted an 'error' event with the error object.发出error事件的对象.error.domain_bound
The callback function which was bound to the domain, and passed an error as its first argument.绑定到domain上的callback,callback的第一个参数需要指定为error.error.domain_thrown
A boolean indicating whether the error was thrown, emitted, or passed to a bound callback function.一个boolean对象,指定这个error对象是被抛出的还是发出的,或者传到到domain 绑定的callback中.
当一个EventEmitter遇到一个错误时,典型的动作时发出一个error事件.在node里面,error事件将会被作为特殊情况处理,如果没有相应的监听函数,默认的动作是打印堆栈信息,然后退出程序.
当所有的EventEmitter对象在添加新的监听函数时都会发出newListener事件.
隐式绑定(Implicit Binding)
如果domain被启用的,那么所有的新的EventEmitter对象(包括:Stream对象,request对象,response对象等等)都将会在他们被创建的时候隐式的绑定到这个激活的domain上.
此外,传递给低级别的事件循环请求(例如:fs.open,或者的callback-taking方法)将会自动的绑定到激活的domain上.如果他们抛出异常,domain会捕获错误信息.
为了避免使用过多的内存,domain对象不会被隐式的添加为当前激活的domain的子对象.如果他们存在,这将不容易阻止request和response对象成为合适的垃圾收集对象.
如果你需要内嵌一个domain对象到一个父domain对象中,你必须明确的添加他们,并且稍后调用dispose()方法(dispose是销毁domain对象,稍后有介绍).
隐式绑定路由跑出错误信息和error事件到domain的error事件中.但是不会在domain对象上注册事件触发器,所以domain.dispose()不会关闭事件触发器.隐式绑定只是处理抛出的错误信息和error事件.
显示绑定(Explicit binding)
有时,domain对象不应该被当成一个指定事件的事件发射器(Emitter)来使用.或者,事件发射器已经在一个domain中的环境变量中被创建,但是应该被绑定到其他domain上.
例如这里有一个http服务器的domain对象,但是我们想在每个request上使用一个单独的domain.
通过显示绑定就有可能实现.
例如:
// create a top-level domain for the server
var serverDomain = domain.create();
serverDomain.run(function() {
// server is created in the scope of serverDomain
http.createServer(function(req, res) {
// req and res are also created in the scope of serverDomain
// however, we'd prefer to have a separate domain for each request.
// create it first thing, and add req and res to it.
var reqd = domain.create();
reqd.add(req);
reqd.add(res);
reqd.on('error', function(er) {
console.error('Error', er, req.url);
try {
res.writeHead(500);
res.end('Error occurred, sorry.');
res.on('close', function() {
// forcibly shut down any other things added to this domain
reqd.dispose();
});
} catch (er) {
console.error('Error sending 500', er, req.url);
// tried our best. clean up anything remaining.
reqd.dispose();
}
});
}).listen(1337);
});
domain.create()
- return:Domain
Class:Domain
domain.run(fn)
fn
Function
var d = domain.create();
d.on('error', function(er) {
console.error('Caught error!', er);
});
d.run(function() {
process.nextTick(function() {
setTimeout(function() { // simulating some various async stuff
fs.open('non-existent file', 'r', function(er, fd) {
if (er) throw er;
// proceed...
});
}, 100);
});
});
domain.members
- Array
domain.add(emitter)
- event Emitter|timer Emitter|timer to be added to the domain. 事件触发器或者定时器触发器或者定时器被添加到domain中.
domain.remove(emitter)
- event Emitter|timer Emitter|timer to be added to the domain. 事件触发器或者定时器触发器或者定时器被从domain中移除.
domain.bind(cb)
- cb function 回调函数.
- return:function,绑定后的函数.
var d = domain.create();
function readSomeFile(filename, cb) {
fs.readFile(filename, 'utf8', d.bind(function(er, data) {
// if this throws, it will also be passed to the domain
return cb(er, data ? JSON.parse(data) : null);
}));
}
d.on('error', function(er) {
// an error occurred somewhere.
// if we throw it now, it will crash the program
// with the normal line number and stack message.
});
domain.intercept(cb)
- cb function 回调函数.
- return:function,被拦截的函数.
例子:
var d = domain.create();
function readSomeFile(filename, cb) {
fs.readFile(filename, 'utf8', d.intercept(function(data) {
//也就是说只要使用了d.intercept()方法包裹的回调函数,如果他们发生错误或者发出error事件,都会被统一的下面的d.on('error',fn)所处理.这种情况和domain.run的区别是domain.run是需要所有的把所有东西都放在一个domain里面,才能拦截domain的对象的事件.而domain.intercept(),你想包裹哪一个回调函数都行.可以对异常类型进行全局处理.
// note, the first argument is never passed to the
// callback since it is assumed to be the 'Error' argument
// and thus intercepted by the domain.
// if this throws, it will also be passed to the domain
// so the error-handling logic can be moved to the 'error'
// event on the domain instead of being repeated throughout
// the program.
return cb(null, JSON.parse(data));
}));
}
d.on('error', function(er) {
// an error occurred somewhere.
// if we throw it now, it will crash the program
// with the normal line number and stack message.
});
domain.dispose()
dispose方法用来销毁一个domain对象,并且在清空任何一个和所有io和这个domain有关联的对象或事件时,努力做到最好.流(Streams)可以被终止,结束,关闭,并且/或者 销毁.定时器是被清除.显示绑定的回调函数不会在会调用.任何一个从domain中出现的error事件也会被忽略.
调用dispose的意图通常是为了当domain的环境变量被发现在一个错误的状态时避免发生级联错误.
一旦domain被disposed掉,dispose事件将会发出.
注意:io操作可能还会继续执行.然而,为了达到最大限度的可能性,一旦一个domain被disposed,在domain中的发射器集合中产生的或者发出的错误信息将会被忽略.所以,甚至如果一些剩下的动作依然在执行,node也不会在和他们有深层次的交流.
发表评论
-
一起读nodejs(九)----缓存类(Buffer)
2012-09-21 09:20 3346本文是对nodejs0.8.9版本的api开发手 ... -
一起读nodejs(一)----概览和全局对象(Synopsis &Global Objects)
2012-09-03 09:02 744本文是对nodejs0.8.9版本的api开发手册解读.nod ... -
一起读nodejs(二)----控制台和定时器(console &Timer)
2012-09-06 09:30 916本文是对nodejs0.8.9版本的api开发手册解读.nod ... -
一起读nodejs(三)----模块(Modules)
2012-09-07 08:37 1150本文是对nodejs0.8.9版本的api开发手册解读.n ... -
一起读nodejs(四)----插件(addons)
2012-09-10 08:58 2161本文是对nodejs0.8.9版本的api开发手册解读 ... -
一起读nodejs(五)----进程(process)
2012-09-12 08:51 1686本文是对nodejs0.8.9 ... -
nodejs version 0.8.9稳定版更新日志
2012-09-12 09:46 11992012.09.11,0.8.9版本(稳定版) ... -
一起读nodejs(六)----工具类(Utilties)
2012-09-14 08:51 2646本文是对nodejs0.8.9版 ... -
一起读nodejs(七)----事件(Events)
2012-09-17 08:46 1114本文是对nodejs0.8.9版本的api开发手册解读.n ...
相关推荐
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间高效的转码 nodejs中用于各种字符集间...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
本文介绍了Node Js 使用KOA处理form-data格式传输过来的文件,分享给大家。具体如下: 使用koa有一段时间了,评价是小巧精悍,只封装了基本的如request对象和response对象到上下文中,其他功能基本上靠第三方中间件...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
NodeJS node-v17.0.0-x64.msi
描述 "Nodejs-16 x64位windows 安装包" 确认了这个安装包是为 Windows 用户设计的,特别是那些需要运行 64 位应用程序的用户。x64 表示该版本支持 64 位架构,这意味着它可以充分利用 64 位计算机的内存和处理器能力...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
cos-nodejs-sdk-v5腾讯云 COS Nodejs SDK()installnpm i cos-nodejs-sdk-v5 --savedemo// 引入模块var COS = require('cos-nodejs-sdk-v5');// 创建实例var cos = new COS({ SecretId: '...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装