1.回调函数
假定有两个函数f1和f2,后者等待前者的执行结果。如果f1是一个很耗时的任务,可以考虑把f2写成f1的回调函数。
1 function f1(callback){ 2 setTimeout(function () { 3 // f1的任务代码 4 callback(); 5 }, 1000); 6 } 7 //执行代码就变成下面这样: 8 f1(f2);
采用这种方式,我们把同步操作变成了异步操作,f1不会堵塞程序运行,相当于先执行程序的主要逻辑,将耗时的操作推迟执行。
回调函数的优点:简单、容易理解、部署
缺点:不利于代码的阅读和维护,各个部分之间高度耦合,流程会很混乱,而且每个任务只能指定一个回调函数。
2.事件驱动
任务的执行不取决于代码的顺序,而取决于某个事件是否发生。
1 f1.on('done', f2);
1 function f1(){ 2 3 setTimeout(function () { 4 5 // f1的任务代码 6 7 f1.trigger('done'); 8 9 }, 1000); 10 11 }
首先,为f1绑定一个事件。执行完成任务后立即触发done事件,从而开始执行f2。
优点:比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以去耦合,有利于实现模块化。
缺点:整个程序都要变成事件驱动型,运行流程会变得很不清晰。
转载:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html