ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
随着Web2.0的带来,JavaScript在前端担任了更多职责,事件也得到了广泛应用。Node不像Rhino那样受Java影响很大,而是将前端浏览器中应用广泛的成熟的事件引入后端,配合异步 I/O, 将事件点暴露给业务逻辑。 下面的例子是Ajax异步提交的服务器端处理过程。Node创建一个Web服务器,并侦听 8080 端口。对于服务器,我们为其绑定了 request 事件,对于请求对象,我们为其绑定了 data 事件和 end 事件: ~~~ const http=require('http'); const querystring = require('querystring'); // 侦听服务器的request事件 http.createServer((req, res)=>{ var postData=''; req.setEncoding('utf-8'); // 侦听请求的data事件 req.on('data', (trunk)=>{ postData += trunk; }); // 侦听请求的 end 事件 req.on('end',()=>{ res.end(postData); }) }).listen(8080); console.log('服务器启动完成'); ~~~ 相应地,我们在前段为Ajax请求绑定了 success 事件,在发出请求后,只需关心请求成功时执行相应的业务逻辑即可,相关代码如下: ~~~ $.ajax({ 'url':'/url', 'method':'POST', 'data':{}, 'success':function(data){ //success 事件 } }); ~~~ 相比之下,无论在前端还是后端,事件都是常用的。对于其它语言来说,这种JavaScript的熟悉感是基本不会出现的。 事件的编程方式具有轻量级、松耦合、只关注事务点等优势,但是在多个异步任务场景下,事件与事件之间各自独立,如何协作是一个问题。 从前面可以看到,回调函数无处不在。这是因为在JavaScript中,我们将函数作为一等公民,可以将函数作为对象传递给方法作为实参进行调用。 与其它的Web后端编程语言相比,Node除了异步和事件外,回调函数是一大特色。纵观下来,回调函数也是也是最好的接受异步调用返回数据的方式。但这种编程方式对于很多习惯同步思路编程的人来说,也许是十分不习惯的。代码的编写顺序与执行顺序并无关系,这对他们可能造成阅读上的障碍。在流程控制方面,因为穿插了异步方法和回调函数,与常规的同步方式相比,变得不那么一目了然了。 在转变为异步编程思维后,通过对业务的划分和对事件的提炼,在流程控制方面处理业务的复杂度与同步方式实际上是一致的。 关于流程控制和事件协作的方法和技巧,我们将在第4章中进一步探讨。