1. 异步编程简介
Node.js是一种基于Chrome V8引擎的JavaScript运行环境。Node.js采用事件驱动、非阻塞I/O模型,能够处理大量并发连接,常用于构建高性能、可伸缩的网络应用程序。
JavaScript语言是单线程的,在大量的I/O操作时,为了不阻塞后面的代码执行,需要将一部分代码转换成异步的形式。Node.js中采用的异步编程模型是基于回调函数。
2. 回调函数
回调函数是一种函数,可以被当作参数传递到另一个函数中,在适当的时候被调用。
2.1 回调函数的基本语法
function callbackFunc(arg1, arg2, callback) {
// 执行异步操作
// 异步操作完成后调用callback
callback(result);
}
回调函数通常有两个参数,一个是err参数用于处理错误,另一个是result参数用于处理结果。
2.2 回调函数的错误处理
回调函数中通常需要对可能出现的错误进行处理,可以将第一个参数作为err参数,如果没有错误,err参数为null或undefined。
function callbackFunc(arg1, arg2, callback) {
// 执行异步操作
if (/* 异步操作出错 */) {
callback(err);
} else {
callback(null, result);
}
}
3. 事件驱动模型
Node.js的异步编程模型是基于事件驱动的。事件驱动模型中,程序不断监听事件,当事件发生时执行回调函数。
3.1 EventEmitter
Node.js中的EventEmitter模块是一个基于事件驱动的模块,提供了多个方法用于触发和监听事件。
通过继承EventEmitter,可以实现自定义事件的触发和监听。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('触发事件');
});
myEmitter.emit('event');
3.2 error事件
Node.js中的EventEmitter模块有一个特殊的error事件,可以用于处理未捕获的错误,避免程序因为错误而崩溃。
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.on('error', (err) => {
console.error(err);
});
myEmitter.emit('error', new Error('错误信息'));
4. Promise
Promise是一种异步编程模型,可以将异步操作封装成一个Promise对象,简化回调函数的使用。
4.1 Promise对象的三种状态
Promise对象有以下三种状态:
pending:初始状态,既不是成功,也不是失败状态。
fulfilled:异步操作成功,Promise对象的状态变为fulfilled,可以在then()方法中添加回调函数处理结果。
rejected:异步操作失败,Promise对象的状态变为rejected,可以在catch()方法中添加回调函数处理错误。
4.2 Promise链式调用
Promise可以链式调用,将多个异步操作串起来形成一个异步操作的链条,便于代码的编写和维护。
promise1().then(result1 => {
return promise2(result1);
}).then(result2 => {
return promise3(result2);
}).then(result3 => {
console.log(result3);
}).catch(err => {
console.error(err);
});
5. async/await
async/await是ES2017的新特性,基于Promise实现,可以将异步代码写成同步的形式。
5.1 async函数
async函数总是返回一个Promise对象。
async function func() {
return '结果';
}
func().then(result => {
console.log(result);
}).catch(err => {
console.error(err);
});
5.2 await表达式
await表达式只能在async函数中使用,它会暂停async函数的执行,等待Promise对象的解决。
async function func() {
const result1 = await promise1();
const result2 = await promise2();
const result3 = await promise3();
console.log(result1, result2, result3);
}
6. 结论
Node.js的异步编程模型是基于回调函数、事件驱动、Promise、async/await等方式实现的。在编写Node.js的异步代码时,应该采用合适的方法,根据实际需求和场景来选择使用。