Practical Node.js (2018版) 14章, async code in Node

时间:2022-04-21 19:11:14

Asynchronous Code in Node


历史上,Node开发者只能用回调和事件emitters。

现在可以使用一些异步的语法:

  • async module
  • Promises
  • Async/await funcitons

Promise

the docs,

在hook下,一个基本的promise的运行。

Promises不是取代callback,它仍然使用callback。

例子:

这是传统的callback用法

function myAsyncTimeoutFn(data, callback) {
setTimeout(() => {
callback()
}, 1000)
} myAsyncTimeoutFn('just a silly string argument', () => {
console.log('Final callback is here')
})

Promise改变了代码的布局:

这是模仿Promise原理的代码。返回一个Promise对象。

function myAsyncTimeoutFn(data) {

  let _callback = null
setTimeout( () => {
if ( _callback ) _callback()
}, 1000) return {
then(cb) {
_callback = cb
}
}
} myAsyncTimeoutFn('just a silly string argument').then(() => {
console.log('Final callback is here')
})

这个对象有内有一个特别的方法then。

执行这个方法then,会设置回调_callback变量。

最后调用event queue的任务setTimeout()。执行_callback()。

⚠️:_callback这种写法只是告诉其他开发者这个方法是私有的。

如何处理错误?很简单在返回对象内的then方法添加一个错误参数。

// 使用file system模块中的readFile()方法,异步函数。
const fs = require('fs') function readFilePromise( filename) {
let _callback = () => {}
let _errorCallback = () => {} fs.readFile(filename, (error, buffer) => {
if (error) _errorCallback(error)
else _callback(buffer)
}) return {
then(cb, errCb) {
_callback = cb
_errorCallback = errCb
}
}
} readFilePromise('package.json').then( buffer => {
console.log(buffer.toString() )
process.exit(0)
}, err => {
console.error(err)
process.exit(1)
})

语法

p.then(onFulfilled[, onRejected]);

p.then((value) => {
// fulfillment
}, (reason) => {
// rejection
});

1. 执行readFilePromise函数

2. fs.readFile()读数据,并存入内存,等待后续处理。

3. return返回一个对象。

4.调用对象的then方法。

5.从event queue中读取回调函数

(error, buffer) => {
if (error) _errorCallback(error)
else _callback(buffer)
})

改变一下上面的代码:

readFilePromise('package.jsqn').then( buffer => {

就会在terminal 上打印错误信息:

{ [Error: ENOENT: no such file or directory, open 'package.jsqn']
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: 'package.jsqn' }

总结:

我们没有使用回调callback参数在主函数中传递值,相反,我们使用callback参数在then方法内。

callback参数的值是一个函数会在之后处理。就像标准的回调函数一样。


Async functions

一个promise的wrapper。

优势:async/await函数的语法在其他语言如C#内已经存在。

下面使用async/await来重写