你可能知道,Javascript语言的执行环境是“单线程”(single thread)。
所谓“单线程”,就是指一次只能完成一项任务。 如果有多个任务,必须排队,后一个任务完成,再执行前一个任务,以此类推。
这些模式的好处是实现比较简单,执行环境也比较简单; 优点是只要一个任务持续时间较长,前面的任务就必须排队,这样就会延迟整个程序的执行。 常见的浏览器无响应(假死)往往是由于某段Javascript代码运行时间较长(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。
为了解决这个问题,Javascript语言将任务执行模式分为两种:同步(Synchronous)和异步(Asynchronous)。
“同步模式”就是上一段中的模式。 后一个任务等待前一个任务结束,然后执行。 程序的执行顺序与任务的顺序一致,是同步的; “异步模式”则完全不同。 每个任务都有一个或多个回调函数(callbacks)。 上一个任务结束后,执行回调函数,而不是执行下一个任务。 后一个任务的执行无需等待前一个任务结束,因此程序的执行顺序与任务的执行顺序相同。 的排序顺序不一致且异步。
“异步模式”尤为重要。 在浏览器端,需要很长时间的操作应该异步执行,以防止浏览器失去响应。 最好的反例是Ajax操作。 在服务器端,“异步模式”甚至是唯一的模式,因为执行环境是单线程的,如果允许所有http请求同步执行,服务器性能会相应提高,响应很快就会丢失。
本文总结了“异步模式”编程的4种方法。 了解它们可以让你写出结构更合理、性能更好、更容易维护的Javascript程序。
1.回调函数
这是异步编程最基本的技术。
假设有两个函数f1和f2,前者等待后者的执行结果。
f1();
f2();
如果f1是一个非常耗时的任务,可以考虑重写f1,将f2写成f1的反弹函数。
函数f1(回调){
设置超时(函数(){
//f1任务代码
打回来();
},1000);
执行代码如下:
f1(f2);
使用这些方法,我们将同步操作变成了异步操作。 f1不会阻塞程序运行javascript的执行顺序,相当于先执行程序的主要逻辑,延迟执行耗时操作。
弹跳功能的优点是简单,易于理解和部署,但缺点是不利于代码阅读和维护,各部分之间耦合度高(Coupling),流程会很混乱,并且每个任务只能指定一个弹跳函数。
2.事件窃听
另一种思路是采用风浪驱动方式。 任务的执行并不取决于代码的顺序,而是取决于是否发生某种风暴。
仍以f1和f2为例。 首先,将storm绑定到f1(这里使用jQuery的方式)。
f1.on('完成',f2);
上一行代码的意思是当f1发生donestorm时javascript的执行顺序,执行f2。 之后,重写f1:
函数f1(){
设置超时(函数(){
//f1任务代码
f1。 触发('完成');
},1000);
f1.trigger('done')表示执行完成后,会立即触发done风暴,从而开始执行f2。
这些方法的优点是比较容易理解,可以绑定多个storm,每个storm可以指定多个反弹函数,并且可以“解耦”,有利于实现。 缺点是整个程序必须做成风暴驱动,运行过程会显得很不清晰。
发表评论