JavaScript实现异步编程的方法有:易于理解和实现但是代码不好维护的回调方法,发布/订阅方法,易于理解并且可绑定多个事件但是工作流程混乱的事件监听方法,Promises方法
异步模式是非常重要,在浏览器端长时间运行的操作应该异步执行,以避免不响应。接下来将在文章中为大家详细介绍JavaScript中异步编程方法的实现,具有一定参考作用,希望对大家有所帮助。
【推荐课程:JavaScript教程】
大家都知道JavaScript的执行环境是单线程的,单线程就意味着在任何时候都只能运行一个任务。如果遇到多任务的时候就需要在队列中等待上一任务的完成。因此耗费时间比较多,同步模式就类似于这种单线程模式,异步模式是完全不同的,每一个任务都有一个回调函数,当一个任务完成后,它将执行回调函数,后面的任务可以与前一个任务同时运行。任务的执行顺序与队列中的任务序列不同。
方法一:回调方法
这个方法是异步编程的基本方法,假设有两个函数f1和f2,后者将等待第一个函数的结果。
F1(); F2();
如果f1是长时间运行的操作,则可以重写f1并将f2作为f1的回调函数。
function f1(callback){ setTimeout(function () { callback(); }, 1000); }
使用此模式,同步操作就可以转换为异步操作,f1不会阻止程序执行,它会将先执行主逻辑然后再执行耗时的操作
回调函数的优点是易于理解和实现,缺点是代码不可读和可维护,不同的组件高度耦合,工作流非常混乱,每个任务只能有一个回调函数。
方法二:发布/订阅
此事件可以理解为信号,假设存在信号中心,如果一个任务完成,它将向信号中心发布信号,其他任务可以从订阅信号中心接收指定信号。这种方法就称为发布/订阅模式或者是观察者模式。
例:f2向信号中心订阅完成信号
jQuery.subscribe(“done”,f2);
然后写f1为
function f1(){ setTimeout(function () { jQuery.publish("done"); }, 1000); }
jQuery.publish(“done”)
表示当f1完成执行时它将向信号中心发送一个完成信号,然后f2将开始执行。
当f2完成执行时,它可以取消订阅。
jQuery.unsubscribe(“done”,f2);
方法三:事件监听
另一种方法是事件驱动模式,一个任务的执行不依赖于代码顺序,它们等待一个事件发生。在本例中仍然使用f1和f2,首先将一个事件绑定到f1。
f1.on('done',f2);
上述代码的含义是如果f1完成事件发生,则执行f2。
function f1(){ setTimeout(function () { f1.trigger('done'); }, 1000); }
f1.trigger('done')
表示它将触发done事件,然后在执行完成时执行f2。
优点是它易于理解并且可以绑定多个事件,每个事件都可以具有许多回调函数,并且它可以解耦哪个有利于模块化。缺点是整个程序将被事件驱动,工作流程不是很清楚。
方法四:Promises方法
Promises对象是CommonJS提出的标准,目的是为异步编程提供通用接口。每个异步任务都会返回一个Promises对象,这个对象有一个允许设置回调函数的then方法。例如,f1的回调函数f2:
F1().then(F2)
f1应写成:
function f1(){ var dfd = $.Deferred(); setTimeout(function () { dfd.resolve(); }, 500); return dfd.promise; }
优点是回调函数是链接的,程序的工作流程非常清晰,它有一套完整的链接方法,可用于实现强大的功能。
例如,设置多个回调函数:
f1().then(f2).then(f3);
还有一个例子,如果有错误:
f1().then(f2).fail(f3);
其他三种方法不具备的一个优点是一旦完成一个任务,如果添加更多的回调函数,它们将立即执行。缺点是它不容易理解。
总结:以上就是本篇文章的全部内容了,希望对大家有所帮助。
以上是javascript异步编程方法有哪些的详细内容。更多信息请关注PHP中文网其他相关文章!