`
songkang666
  • 浏览: 105525 次
  • 性别: 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-StuQ分享专题《深入浅出jsNode.js异步流程控制》完整版

    在Node.js中,异步处理主要通过回调函数、事件循环、Promise和async/await等机制实现。 1. **回调函数**:在早期的Node.js开发中,回调是最常见的异步处理方式。当一个操作完成时,会调用预先定义好的函数,以处理...

    Node.js异步错误处理LAEH2.zip

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

    Node.js开发-Node.js入门.pdf

    Node.js 维护一个事件队列,需执行的每个任务都会加入事件队列,并提供一个包含处理结果的回调函数。 Node.js 的应用场合包括: * 实时数据处理 * 高性能 Web 应用程序 * 数据分析和科学计算 * 实时通信和游戏...

    Node.js异步编程

    在Node.js中,异步编程主要通过回调函数、Promise、async/await等方式实现。回调函数是最初级的异步处理方式,例如使用fs模块读取文件时: ```javascript const fs = require('fs'); fs.readFile('myfile.txt', '...

    node.js最新手册

    1. **事件驱动编程**:Node.js的核心就是事件循环和回调函数,理解如何处理异步操作是学习Node.js的基础。 2. **模块系统**:Node.js使用模块化设计,每个`.js`文件都可以视为一个模块,通过`require`和`exports`或`...

    Node.js-Doodoo.js--中文最佳实践Node.jsWeb快速开发框架支持Koa.js中间件

    Koa.js 是由 Express.js 的创建者开发的下一代 web 开发框架,它摒弃了传统的回调函数,而是采用 ES6 的异步函数(async/await)来处理请求。Koa.js 的核心是中间件机制,这种机制允许开发者以洋葱模型的方式串联多...

    《Node入门一本全面地Node.js教程》PDF

    - **回调函数**:Node.js中的异步操作通常通过回调函数实现,但过度使用可能导致回调地狱问题。 - **Promise**:Promise是解决回调地狱的工具,提供了链式调用和错误处理机制。 - **async/await**:基于Promise的...

    node.js实战 pdf+源码

    通过回调函数、Promise和async/await等机制,开发者可以处理大量并发请求,避免了传统的多线程模型中的上下文切换开销。 3. **事件循环**:Node.js采用单线程的事件循环模型,当一个任务执行完毕后,会触发下一个...

    Node.js 中文手册 中文文档 chm

    9. **错误处理**:Node.js 中错误处理是异步的,通常通过回调函数的错误参数或者使用 `try...catch` 结构来捕获错误。 10. **Promise 和 async/await**:Node.js 从 v6 版本开始支持 ES6 的 Promise,以及后来的 ...

    Node.js连接OpenGauss异步转同步封装

    通过这样的封装,开发人员可以更方便地在Node.js应用程序中管理和操作OpenGauss数据库,而无需担心回调函数的复杂性。这种同步封装方法在保持代码可读性的同时,也降低了理解和调试的难度,提升了开发效率。

    pdf版,Node.js开发实战详解

    书中会详细解释这种异步编程模型,并通过实例演示如何编写异步代码,如使用回调函数、Promise以及现代的async/await语法。 再者,书中的实战部分可能涵盖创建基本的HTTP服务器、搭建RESTful API、处理路由、中间件...

    Node.js初级+进阶

    Node.js的异步I/O是通过回调函数来实现的,避免了阻塞主线程,提高了程序的运行效率。`fs`模块提供了文件系统的异步操作API,如`fs.readFile()`和`fs.writeFile()`等,用于读写文件,这些方法都接受一个回调函数作为...

    node.js源码 node-v21.0.0.tar.gz

    9. **异步编程**:Node.js主要采用回调函数、Promise和async/await进行异步编程,这些机制帮助开发者处理复杂的异步流程,避免回调地狱。 10. **性能监控**:Node.js提供了如`process`对象,可以获取CPU使用率、...

    Node.js-深入理解Node.js核心思想与源码分析

    它使用回调函数来处理异步操作,使得程序能够快速响应并保持高效率。 2. 非阻塞I/O:Node.js利用libuv库实现跨平台的非阻塞I/O操作,极大地提高了性能,尤其在处理大量I/O密集型任务时表现优异。 3. 模块化设计:...

    Node.js入门经典 源代码

    1. 异步编程:Node.js主要依赖回调函数进行异步编程,但这种模式可能导致回调地狱。后来引入了Promise和async/await,使得异步代码更易读、更易于管理。 2. 模块系统:Node.js使用CommonJS规范,通过require导入模块...

    Node.js技术参考手册

    异步编程是Node.js的核心,常见的异步方式有回调函数、Promise、async/await等。它们用于处理I/O操作,避免程序因等待结果而阻塞。 **10. 同步与异步的比较** - **同步**:代码按照顺序执行,直到当前任务完成才会...

    Node.js基础开发指南.pdf 清晰中文完整版

    3. 异步编程:Node.js的核心就是异步编程,理解和掌握回调函数、Promise和async/await是关键。 4. 网络编程:利用http模块可以创建HTTP服务器,实现Web应用的开发。 5. 流(Stream):Node.js中的流数据处理方式,...

    Node.js资料文件(中文文档)

    - **回调函数**:Node.js中的大部分操作都是异步的,通过回调函数来处理完成后的结果。 - **模块系统**:Node.js有内置的模块系统,可以方便地组织代码和复用功能。 - **文件系统**:Node.js提供了强大的文件系统...

Global site tag (gtag.js) - Google Analytics