Skip to content

Commit

Permalink
校对:xitu#7 Events Arguments and Errors
Browse files Browse the repository at this point in the history
  • Loading branch information
薛定谔的猫 authored and aladdin-add committed Jun 1, 2017
1 parent c27f3e6 commit 0c5681a
Showing 1 changed file with 14 additions and 15 deletions.
29 changes: 14 additions & 15 deletions TODO/understanding-node-js-event-driven-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -334,33 +334,33 @@ class WithTime extends EventEmitter {

这真的看起来更易读了呢!`async/await` 特性使我们的代码更加贴近 JavaScript 本身, 我认为这是一大进步。

#### Events Arguments and Errors ####
#### 事件参数及错误 ####

在之前的例子中,我们使用了额外的参数来发射两个事件。

错误的事件使用了错误对象,data 事件使用了 data 对象
错误事件使用了错误对象,data 事件使用了 data 对象

```js
this.emit('error', err);
```

The data event is emitted with a data object.
data 事件使用了 data 对象。

```js
this.emit('data', data);
```

在listener函数调用的时候我们可以传递很多的参数,这些参数在执行的时候都会切实可用。
在 listener 函数调用的时候我们可以传递很多的参数,这些参数在执行的时候都会切实可用。

例如:data事件执行的时候,listener函数在注册的时候就会允许我们的接纳事件发射的data参数,而asyncFunc函数也实实在在暴露给了我们
例如:data 事件执行的时候,listener 函数在注册的时候就会允许我们的接纳事件发射的 data 参数,而 asyncFunc 函数也实实在在暴露给了我们

```js
withTime.on('data', (data) => {
// do something with data
});
```

error事件也是同样是典型的一个。在我们基于callback的例子中,如果没用listener函数来处理错误,node进程就会直接终止-。-
error 事件通常是特例。在我们基于 callback 的例子中,如果没用 listener 函数来处理错误,Node 进程就会直接终止-。-

我们写个例子来展示这一点:

Expand All @@ -385,7 +385,7 @@ withTime.execute(fs.readFile, __filename);
```

The first execute call above will trigger an error. The node process is going to crash and exit:

上面代码中调用 excute 会触发一个错误,Node 进程会崩溃然后退出:
```bash
events.js:163
throw er; // Unhandled 'error' event
Expand All @@ -396,7 +396,7 @@ Error: ENOENT: no such file or directory, open ''

第二个执行调用将受到之前崩溃的影响,并可能不会得到执行。

如果我们注册一个listener来处理它,情况就不一样了:
如果我们注册一个 listener 来处理 error 对象,情况就不一样了:

```js
withTime.on('error', (err) => {
Expand All @@ -405,8 +405,7 @@ withTime.on('error', (err) => {
});
```

If we do the above, the error from the first execute call will be reported but the node process will not crash and exit. The other execute call will finish normally:

加上了上面的错误处理,第一个 excute 调用的错误会被报告,但 Node 进程不会再崩溃退出了,其它的调用也会正常执行:
```bash
{ Error: ENOENT: no such file or directory, open '' errno: -2, code: 'ENOENT', syscall: 'open', path: '' }
execute: 4.276ms
Expand All @@ -420,9 +419,9 @@ UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1):
DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```
另一种方式处理emit的error的方法是注册一个全局的uncaughtException进程事件,但是,全局的捕获错误对象并不是一个好办法。
另一种方式处理 emit 的 error 的方法是注册一个全局的 uncaughtException 进程事件,但是,全局的捕获错误对象并不是一个好办法。
标准的关于uncaughtException的建议是不要使用他,你一定要用的话,应该让进程在此结束:
关于 uncaughtException 的建议是不要使用。你一定要用的话,应该让进程在此结束:
```js
process.on('uncaughtException', (err) => {
Expand All @@ -440,9 +439,9 @@ process.on('uncaughtException', (err) => {
EventEmitter模块暴露一个once方法。这种方法只需要调用一次监听器,而不是每次发生。所以,这是一个实际使用的uncaughtException用例因为第一未捕获的异常我们就开始做清理工作,无论如何我们要知道退出的过程。
#### Order of Listeners ####
#### 监听器的顺序 ####
如果我们在一个事件上注册多个队列,并且期望这些listener是有顺序的,会按顺序来调用
如果我们在同一个事件上注册多个监听器,则监听器会按顺序触发,第一个注册的监听器就是第一个触发的。
```js
// प्रथम
Expand Down Expand Up @@ -476,7 +475,7 @@ withTime.prependListener('data', (data) => {
withTime.execute(fs.readFile, __filename);
```
这时“Characters”会在“Length”之前。
上面的代码使得 “Characters”“Length” 之前。
最后,想移除的话,用removeListener方法就好啦!
Expand Down

0 comments on commit 0c5681a

Please sign in to comment.