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


不知道有没有更好的解决方法,之前看到 Node.js 异步异常的处理与domain模块解析,还没来得及细看。

more:
关于异常处理的一个教训,再次理解什么是异步回调.

你可能感兴趣的:(node.js)