说实话,这里并不能给出完美的解决办法,只是等待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中,异步处理主要通过回调函数、事件循环、Promise和async/await等机制实现。 1. **回调函数**:在早期的Node.js开发中,回调是最常见的异步处理方式。当一个操作完成时,会调用预先定义好的函数,以处理...
LAEH2 会存储回调线程的堆栈轨迹,这个堆栈轨迹会附加到回调中的主异常堆栈轨迹中,或者是把错误用异步函数进行回调。 LAEH2 会缩小显示堆栈轨迹,用可选选项隐藏 laeh2.js 框架本身和 Node.js 核心库文件;为减少...
Node.js 维护一个事件队列,需执行的每个任务都会加入事件队列,并提供一个包含处理结果的回调函数。 Node.js 的应用场合包括: * 实时数据处理 * 高性能 Web 应用程序 * 数据分析和科学计算 * 实时通信和游戏...
在Node.js中,异步编程主要通过回调函数、Promise、async/await等方式实现。回调函数是最初级的异步处理方式,例如使用fs模块读取文件时: ```javascript const fs = require('fs'); fs.readFile('myfile.txt', '...
1. **事件驱动编程**:Node.js的核心就是事件循环和回调函数,理解如何处理异步操作是学习Node.js的基础。 2. **模块系统**:Node.js使用模块化设计,每个`.js`文件都可以视为一个模块,通过`require`和`exports`或`...
Koa.js 是由 Express.js 的创建者开发的下一代 web 开发框架,它摒弃了传统的回调函数,而是采用 ES6 的异步函数(async/await)来处理请求。Koa.js 的核心是中间件机制,这种机制允许开发者以洋葱模型的方式串联多...
- **回调函数**:Node.js中的异步操作通常通过回调函数实现,但过度使用可能导致回调地狱问题。 - **Promise**:Promise是解决回调地狱的工具,提供了链式调用和错误处理机制。 - **async/await**:基于Promise的...
通过回调函数、Promise和async/await等机制,开发者可以处理大量并发请求,避免了传统的多线程模型中的上下文切换开销。 3. **事件循环**:Node.js采用单线程的事件循环模型,当一个任务执行完毕后,会触发下一个...
9. **错误处理**:Node.js 中错误处理是异步的,通常通过回调函数的错误参数或者使用 `try...catch` 结构来捕获错误。 10. **Promise 和 async/await**:Node.js 从 v6 版本开始支持 ES6 的 Promise,以及后来的 ...
通过这样的封装,开发人员可以更方便地在Node.js应用程序中管理和操作OpenGauss数据库,而无需担心回调函数的复杂性。这种同步封装方法在保持代码可读性的同时,也降低了理解和调试的难度,提升了开发效率。
书中会详细解释这种异步编程模型,并通过实例演示如何编写异步代码,如使用回调函数、Promise以及现代的async/await语法。 再者,书中的实战部分可能涵盖创建基本的HTTP服务器、搭建RESTful API、处理路由、中间件...
Node.js的异步I/O是通过回调函数来实现的,避免了阻塞主线程,提高了程序的运行效率。`fs`模块提供了文件系统的异步操作API,如`fs.readFile()`和`fs.writeFile()`等,用于读写文件,这些方法都接受一个回调函数作为...
9. **异步编程**:Node.js主要采用回调函数、Promise和async/await进行异步编程,这些机制帮助开发者处理复杂的异步流程,避免回调地狱。 10. **性能监控**:Node.js提供了如`process`对象,可以获取CPU使用率、...
它使用回调函数来处理异步操作,使得程序能够快速响应并保持高效率。 2. 非阻塞I/O:Node.js利用libuv库实现跨平台的非阻塞I/O操作,极大地提高了性能,尤其在处理大量I/O密集型任务时表现优异。 3. 模块化设计:...
1. 异步编程:Node.js主要依赖回调函数进行异步编程,但这种模式可能导致回调地狱。后来引入了Promise和async/await,使得异步代码更易读、更易于管理。 2. 模块系统:Node.js使用CommonJS规范,通过require导入模块...
异步编程是Node.js的核心,常见的异步方式有回调函数、Promise、async/await等。它们用于处理I/O操作,避免程序因等待结果而阻塞。 **10. 同步与异步的比较** - **同步**:代码按照顺序执行,直到当前任务完成才会...
3. 异步编程:Node.js的核心就是异步编程,理解和掌握回调函数、Promise和async/await是关键。 4. 网络编程:利用http模块可以创建HTTP服务器,实现Web应用的开发。 5. 流(Stream):Node.js中的流数据处理方式,...
- **回调函数**:Node.js中的大部分操作都是异步的,通过回调函数来处理完成后的结果。 - **模块系统**:Node.js有内置的模块系统,可以方便地组织代码和复用功能。 - **文件系统**:Node.js提供了强大的文件系统...