javascript的执行顺序-JavaScript 异步编程的 4 种方法

你可能知道,Javascript语言的执行环境是“单线程”(single thread)。

所谓“单线程”,就是指一次只能完成一项任务。 如果有多个任务,必须排队,后一个任务完成,再执行前一个任务,以此类推。

这些模式的好处是实现比较简单,执行环境也比较简单; 优点是只要一个任务持续时间较长,前面的任务就必须排队,这样就会延迟整个程序的执行。 常见的浏览器无响应(假死)往往是由于某段Javascript代码运行时间较长(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。

为了解决这个问题,Javascript语言将任务执行模式分为两种:同步(Synchronous)和异步(Asynchronous)。

“同步模式”就是上一段中的模式。 后一个任务等待前一个任务结束,然后执行。 程序的执行顺序与任务的顺序一致,是同步的; “异步模式”则完全不同。 每个任务都有一个或多个回调函数(callbacks)。 上一个任务结束后,执行回调函数,而不是执行下一个任务。 后一个任务的执行无需等待前一个任务结束,因此程序的执行顺序与任务的执行顺序相同。 的排序顺序不一致且异步。

“异步模式”尤为重要。 在浏览器端,需要很长时间的操作应该异步执行,以防止浏览器失去响应。 最好的反例是Ajax操作。 在服务器端,“异步模式”甚至是唯一的模式,因为执行环境是单线程的,如果允许所有http请求同步执行,服务器性能会相应提高,响应很快就会丢失。

本文总结了“异步模式”编程的4种方法。 了解它们可以让你写出结构更合理、性能更好、更容易维护的Javascript程序。

1.回调函数

这是异步编程最基本的技术。

假设有两个函数f1和f2,前者等待后者的执行结果。

f1();

javascript的执行顺序_顺序执行和并行执行_顺序执行的程序具有可再现性

f2();

如果f1是一个非常耗时的任务,可以考虑重写f1,将f2写成f1的反弹函数。

函数f1(回调){

设置超时(函数(){

//f1任务代码

顺序执行的程序具有可再现性_javascript的执行顺序_顺序执行和并行执行

打回来();

},1000);

执行代码如下:

f1(f2);

使用这些方法,我们将同步操作变成了异步操作。 f1不会阻塞程序运行javascript的执行顺序,相当于先执行程序的主要逻辑,延迟执行耗时操作。

顺序执行和并行执行_javascript的执行顺序_顺序执行的程序具有可再现性

弹跳功能的优点是简单,易于理解和部署,但缺点是不利于代码阅读和维护,各部分之间耦合度高(Coupling),流程会很混乱,并且每个任务只能指定一个弹跳函数。

2.事件窃听

另一种思路是采用风浪驱动方式。 任务的执行并不取决于代码的顺序,而是取决于是否发生某种风暴。

仍以f1和f2为例。 首先,将storm绑定到f1(这里使用jQuery的方式)。

f1.on('完成',f2);

javascript的执行顺序_顺序执行和并行执行_顺序执行的程序具有可再现性

上一行代码的意思是当f1发生donestorm时javascript的执行顺序,执行f2。 之后,重写f1:

函数f1(){

设置超时(函数(){

//f1任务代码

f1。 触发('完成');

},1000);

f1.trigger('done')表示执行完成后,会立即触发done风暴,从而开始执行f2。

这些方法的优点是比较容易理解,可以绑定多个storm,每个storm可以指定多个反弹函数,并且可以“解耦”,有利于实现。 缺点是整个程序必须做成风暴驱动​​,运行过程会显得很不清晰。