如何在一个类中实现异步

JavaScript09

如何在一个类中实现异步,第1张

开个线程池,为每个方法的执行分配一个线程,创建一个hashmap结果集,每个方法执行完,将其存入hashmap中,最后通过判断hashmap的大小,判断所有方法线程是否执行完毕,执行完毕则返回该hashmap。异步编程其实很常见,特别是在出线Node.js之后,异步编程更是让很多开发者受益。那么回到最初的地方,传统的前端开发中如何实现异步编程呢?下面列举了js实现异步编程的四种方式。方法一:使用回调函数方法二:事件监听可以定义一个事件,并为这个事件设定处理函数。这样只有当这个时间发生的情况下,对应的处理函数才会被执行。方法三:事件的发布/订阅这个模式在NodeJS以及其他JS框架中都有实现,是一个非常常用的异步编程方式。方法四:Promise模式ES6中提供了原生的Promise对象,这个模式最开始只是一个构想,后来由一些框架库实现。Promise对象代表了未来才会知道结果的事件。Promise的基本思路就是,将需要异步执行的事件储存起来,然后根据异步事件之行后的结果状态执行下一步的操作。具体的Promise对象的原理和ES6中的使用方法将在下一篇文章中更加深入的进行介绍。多线程实现。过程如下创建一下对象:robot对象avi保存对象行走对象在robot里使用多线程,2个线程就够,1个执行avi保存对象,1个执行行走对象。之所以要创建3个对象,主要是考虑到软件工程的分而治之的思想。另外如果你真是要制作机器人的话可以做2个系统一个是运动控制系统,一个是avi存储系统,系统间不互联。这样互相不会有干扰,而且容易实现,不会让功能混乱。

更新下,我之所以让您玩一下AJAX,是希望您体验一下异步,并不是希望您了解AJAX这机制的实现方法,因为AJAX是一个特别典型且简单的异步场景,比如:

行某个函数 ->执行语句A,B,C,D ->在D语句发起异步请求,同时向引擎注册一个回调事件 ->执行E,F,G

->退出函数块 ,引擎Loop...Loop...Loop,此时异步的请求得到了Response,之前注册的回调被执行。

@VILIC VANE

也提到了,实际上Node.js主要是为了应对主流web

app存在大量I/O等待而CPU闲置的场景所衍生的解决方案,而在架构上,它的后端有一个底层的worker封装,每当你有一个诸如addUser这样

的I/O操作时,它们都会被交由worker去执行从而达到让出尽快让出当前函数的执行权的目的,在向引擎注册完回调后,内部会通过事件轮询去检查该I

/O事件的句柄,当句柄显示该事件操作完成后,则注册的回调则被执行。

所以,假设有人(按题设,简化一下场景,有且只有2个人)同时请求

addUser(A)和userList(B),B的请求会在执行完A的请求内部所有同步代码后被执行,而哪怕worker此时仍然在进行addUser

这一 I/O操作,用户B也并不会被引擎挂起或者等待。这就是为什么Node.js单节点却一样可以拥有高负载能力的原因。

至于什么样的代码是异步的,你看看node文档里fs模块的使用方法就知道了,大概的形式就是如下这种。

module.method( args [,callback] )

当然还有一种比较极端的情况,假设您使用的数据库是山寨的,驱动是基于同步实现的,那么B就该等多久等多久把,树荫底下喝杯茶,下个棋,和后面的C,D,E,F,G打个招呼呗~

我推荐您先去玩一下前端的AJAX了解一下 异步编程方式,体验一下异步的“感觉”,然后看一本叫《JavaScript异步编程》的书。

Node.js

是一款基于Event-driven的模型构建的Framework,它典型的特征就是通过内置的事件轮询来调度事件,通常来说node.js的数据库驱

动都是基于异步实现的,所以在实际情况中,A提交博客和B注册用户这两个请求是可以同时由Node.js

来handle,并按照实际操作的处理事件分别调度给予浏览器响应。

当然,假设您在业务代码里写了一个耗时很久的同步代码(比如直接写一

个while(true)的loop,Node就死了),由于JavaScript本身单线程的限制,所以整个App就会被block住,后续的事件/程

序只有等到该段代码执行完成之后才会被处理,这也是为什么我们通常不建议在Node.js层做大规模计算(JS本身的计算效率太低,会导致Node吞吐量

会大大降低),而倾向由C++的拓展去实现。