我理解的JavaScript异步编程模型

1、什么是异步?

维基百科的解释: Asynchrony, in computer programming, refers to the occurrence of events independent of the main program flow and ways to deal with such events. These may be "outside" events such as the arrival of signals, or actions instigated by a program that take place concurrently with program execution, without the program blocking to wait for results. Asynchronous input/output is an example of the latter cause of asynchrony, and lets programs issue commands to storage or network devices that service these requests while the processor continues executing the program.

我的翻译:异步,在计算机编程中,是指独立于主程序流程发生的事件,以及处理这些事件的方法。这些事件可能是“外部”事件,例如信号的到达,或(主)程序发起的与(主)程序执行同时发生的(会延迟产生结果的)动作,而程序不会阻塞等待结果(而是继续向下执行)。异步输入/输出是后一种异步原因的一个例子,在它向存储或网络设备发出命令(并等待结果时),处理器继续执行主程序。

2、什么是异步编程?

既然上文“异步”的定义明确指出异步就是“事件”和“方法”,那么我稍加思考就可以猜测出,异步编程就是“创造事件”“提供方法”。事件可能是“信号的到达”或者“会延迟产生结果的动作”。 那么在编程中我们是如何创造事件,并给出处理事件的方法的呢?

我们能创造出“信号到达”这样的事件吗?看到“信号”这个词就会让我想到unix和linux领域里那些我根本不知道的东西。但是,我灵机一动:也许JavaScript中的setTimeOut()正是一个用来创造“信号达到”事件的东西,它在一段时间后给了我一个信号,告诉我时间到了。那么回调函数就是处理这个事件的方法。 于是我们写出了这样的代码来实现异步编程:

我们能创造出“会延迟产生结果的动作”这样的事件吗?很显然可以。上文已经给出了异步IO的例子。所以,在Node.js中我们用这样的代码来实现异步编程:

另外,浏览器中的ajax其实也属于异步输入输出。

3、什么是异步编程模型?

由于维基百科并没有asynchronous programming model词条,而唯一比较权威的微软的这篇文章直接具体到.NET里面的一些函数的用法。所以我稍加揣测,推断出异步编程模型的定义就是在某种编程语言中进行异步编程时编写代码的模板。 比如我们用回调函数来实现异步编程,写出来代码都长得像这样:调用了一个函数,传了一个函数为参数。所以,我们可以说,回调函数就是JS中的一种异步编程模型。那么,JS中有哪些常见的异步编程模型呢?我觉得是:回调函数、事件监听、Promise、Generator、async/await。