node.js 异步函数中回调函数的异常处理

说实话,这里并不能给出完美的解决办法,只是等待god的降临。

目前遇到这么一个实际的问题:

要求异步的读取某个目录(用异步为了使页面不卡到那里),获取目录中所包含的文件名,譬如是这样:

func = (dir) ->
fs.readdir dir, (err, files) ->
if err exist then deal with the err
do sth.

看上去无可厚非,可是如果有这么一个要求:

func1 = (dir) ->
fs.readdir dir, (err, files) ->
do sth. without dealing with the error and just throw them out of this function

func2 = (arg) ->
try
func1 arg
catch err
deal with the err

这里意思就是,在fs.readdir那里的err,我不想进行处理,想在func2下统一进行处理抛出的错误,想这么做应该是没什么问题,但问题是func2永远也捕获不到fs.readdir中所抛出的异常,原因在玩它调用的func1中使用了异步函数,而异常是由该异步函数抛出的,抛出后,有可能fun1已经执行完了,更别提func2,谁人来接手这个异常? -- god,当然god还是派出了他(她?)的手下node接手,node气愤的说:“你大爷,敢吵我睡觉”,于是一枪崩了这个应用,我们的应用也就中止了。

《javascript异步编程》这本书刚开始看,里面倒是看到异步函数中的异常处理,似乎也没有给出什么好的解决办法,p24中提到:"如果想让整个应用停止工作,请勇往直前地大胆使用throw。否则,请认真考虑一下应该如何处理错误。”

让应用停止?杀了我吧。改用同步方法?杀了我吧。在异步函数的回调函数里进行异常的处理?杀了我吧。

这里有个解决办法:
在fun1中new一个emitter,在异步方法所调用的回调函数里,为emitter注册一个error事件,在fun1的最后返回这个emitter,而在func2中为一个变量赋值,让该变量监听error事件,并进行其他处理,代码如下:

events = require 'events'
func1 = (dir) ->
emitter = net events.EventEmitter()
fs.readdir dir, (err, files) ->
return emmitter.emit 'error', err if err?
do sth.
emitter

func2 = (arg) ->
event = func1 arg
event.on 'error', (err) ->
deal with the err


不知道有没有更好的解决方法,之前看到[url=http://deadhorse.me/nodejs/2013/04/13/exception_and_domain.html]Node.js 异步异常的处理与domain模块解析[/url],还没来得及细看。

more:
[url=http://cnodejs.org/topic/515acf7a6d3827730615715e]关于异常处理的一个教训,再次理解什么是异步回调.[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值