JavaScript实现异步编程的方法有:易于理解和实现但是代码不好维护的回调方法,发布/订阅方法,易于理解并且可绑定多个事件但是工作流程混乱的事件监听方法,Promises方法
异步模式是非常重要,在浏览器端长时间运行的操作应该异步执行,以避免不响应。接下来将在文章中为大家详细介绍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); }
当f2完成执行时,它可以取消订阅。 jQuery.unsubscribe(“done”,f2); 方法三:事件监听 另一种方法是事件驱动模式,一个任务的执行不依赖于代码顺序,它们等待一个事件发生。在本例中仍然使用f1和f2,首先将一个事件绑定到f1。 f1.on('done',f2); 上述代码的含义是如果f1完成事件发生,则执行f2。 function f1(){ setTimeout(function () { f1.trigger('done'); }, 1000); }
优点是它易于理解并且可以绑定多个事件,每个事件都可以具有许多回调函数,并且它可以解耦哪个有利于模块化。缺点是整个程序将被事件驱动,工作流程不是很清楚。 方法四: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); 其他三种方法不具备的一个优点是一旦完成一个任务,如果添加更多的回调函数,它们将立即执行。缺点是它不容易理解。 总结:以上就是本篇文章的全部内容了,希望对大家有所帮助。 (责任编辑:yang) |