`
songkang666
  • 浏览: 103166 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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异步错误处理LAEH2.zip

    LAEH2 会存储回调线程的堆栈轨迹,这个堆栈轨迹会附加到回调中的主异常堆栈轨迹中,或者是把错误用异步函数进行回调。 LAEH2 会缩小显示堆栈轨迹,用可选选项隐藏 laeh2.js 框架本身和 Node.js 核心库文件;为减少...

    Node.js 开发指南.pdf

    3.2.2 回调函数 31 3.2.3 事件 33 3.3 模块和包 34 3.3.1 什么是模块 35 3.3.2 创建及加载模块 35 3.3.3 创建包 38 3.3.4 Node.js包管理器 41 3.4 调试 45 3.4.1 命令行调试 45 3.4.2 远程调试 ...

    Node.js 回调函数实例详解

    Node.js 回调函数 阻塞与非阻塞 node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node ...

    Node.js+开发指南

    3.2.2 回调函数 31 3.2.3 事件 33 3.3 模块和包 34 3.3.1 什么是模块 35 3.3.2 创建及加载模块 35 3.3.3 创建包 38 3.3.4 Node.js包管理器 41 3.4 调试 45 3.4.1 命令行调试 45 3.4.2 ...

    Node.js MongoDB AngularJSWeb开发中文版.part1

    4.3.1 向回调函数传递额外的参数 63 4.3.2 在回调中实现闭包 64 4.3.3 链式回调 65 4.4 小结 66 4.5 下一章 66 第5章 在Node.js中处理数据I/O 67 5.1 处理JSON 67 5.1.1 把JSON转换成JavaScript对象 67 5.1.2 把...

    深入理解Node.js 事件循环和回调函数

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. 1、事件驱动程序 Node.js 使用事件驱动模型,当w

    node.js回调函数之阻塞调用与非阻塞调用

    首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善。其次,对于前端人来说,node.js作为js的运行平台,我们...

    ignite:用于node.js的异步状态机框架

    node.js异步函数 并行列表处理(例如reduce , map , each ) 处理多台机器 轻松创建代码的直观表示形式(状态图以及即将推出的顺序图) 只需跨多个流程分配行为 支持工具以帮助设计,调试和部署 文献资料 完整的...

    基于node.js的文件管理系统源码.zip

    基于node.js的文件管理系统源码.zipNode.js 提供一组可用于与文件系统进行交互(以类似于标准 POSIX 函数的方式)的模块 fs 。 使用方式: const fs = require('fs'); 所有的文件系统操作都具有同步的、回调的、...

    关于node.js的异步心得

    关于node.js的异步心得**第一种 使用回调函数**第二种 使用Promise第三种还有可以使用**async**函数和**await**关键字cnst fn =async()=>{} 最近刚刚学了node.js 异步篇 先说一下异步的处理流程 下面用代码解释...

    详解node.js 事件循环

    Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. 事件驱动程序 Node.js 使用事件驱动模型,当web server接收到...

    详解Node.js异步处理的各种写法

    所谓 异步 ,就是程序(线程)在一个任务的处理过程中,会插入处理其他任务,如遇到IO操作,当前任务会将程序(线程)的控制权释放给其他任务,等IO操作结果返回后再继续往下处理。 众所周知,Node.js采用的是单...

    我的Node.js学习之路(三)–node.js作用、回调、同步和异步代码 以及事件循环

    如 在线游戏中可能会有上百万个游戏者,则有上百万的输入等等)(node.js适合的范畴:当应用程序需要在网络上发送和接收数据时Node.js最为适合。这可能是第三方的API,联网设备或者浏览器与服务器之间的实时通信) ...

    深入浅析Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是通过事件和回...Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. 事件驱动模型

    浅谈Node.js之异步流控制

    在没有深度使用函数回调的经验的时候,去看这些内容还是有一点吃力的。由于Node.js独特的异步特性,才出现了“回调地狱”的问题,这篇文章中,我比较详细的记录了如何解决异步流问题。 文章会很长,而且这篇是对异步...

    剖析Node.js异步编程中的回调与代码设计模式

    在代码中,异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。我们首先可以看看以下代码。 function heavyCompute(n, callback) { var count = 0, i, j; for (i = n;...

    NodeJS中利用Promise来封装异步函数

    在写Node.js的过程中,连续的IO操作可能会导致“金字塔噩梦”,回调函数的多重嵌套让代码变的难以维护,利用CommonJs的Promise来封装异步函数,使用统一的链式API来摆脱多重回调的噩梦。  Node.js提供的非阻塞IO...

    Node.js最新技术栈之Promise篇1

    1. 回调函数Callbacks 1. 异步JavaScript 1. 成器Generators/ yield 1. 每个操作都返回样的promise对象,保证

    Node-Samples:Node.js示例

    回调地狱情况异步:使用异步模块进行流控制Promise:使用Promise创建任务并进行进度等待:使用等待的异步任务操作控制05.HTTP 使用http模块的示例基本:HTTP服务器和请求/响应错误:创建HTTP服务器时的错误情况发布...

    Node.js异步I/O学习笔记

    “异步”这个名词的大规模流行是在Web 2.0浪潮中,它伴随着Javascript和AJAX席卷了Web。但在绝大多数高级编程语言中,异步并不多见。PHP最能体现这个特点:它不仅屏蔽了异步,甚至连多线程也不提供,PHP都是以同步...

Global site tag (gtag.js) - Google Analytics