Js语言的执行环境是“单线程”就是指一次只能完成一个任务,如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推。
单线程的好处是实现起来比较简单,执行环境相对单纯,坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。
js分同步模式和异步模式,异步模式,么个任务有一个或多个回调函数,前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序和任务的排列顺序使不一致的、异步的。
处理异步有几种常见的方式
- 回调模式
function f1(callback){
setTimeout(function(){
//f1的任务代码
callback()
},1000)
}
//执行代码就变成:f1(f2)
- 回调函数的有点是简单,容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合,流程会很混乱,而且每个任务只能指定一个回调函数。
- 事件监听:采用事件驱动模式。任务的执行不取决于代码的顺序,而取决于某个事件是否要发生。
f1.on('done',f2)
//当f1发生done事件,就执行f2,然后对f1进行改写
functjion f1(){
setTimeout(function(){
//f1的任务代码
f1.trigger('done')
},1000)
}
//这种方法的优点是,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以“去耦合”,有利于实现模块化。缺点是整个程序都编程事件驱动型,运行流程会变得很不清晰。
- 发布订阅:假定存在一个“信号中心”,某个任务执行完成,就向信号中心“发布”一个信号,其他任务可以向信号中心“订阅”这个信号,从而指导什么时候自己可以开始执行。这就叫做发布订阅模式
//首先f2向信号中心jQuery
订阅done信号
jQuery.subscribe("done",f2)
//然后进行如下改写
function f1(){
setTimeout(function(){
//f1的任务代码
jQuery.publish("done")
},1000)
}
//jQuery.publish('done')的意思是,f1执行完成后,向信号中心jQuery发布done信号,从而引发f2的执行。
此外,f2完成执行后,也可以取消发布订阅
jQuery.unsubscribe("done",f2)
//这种方法的性质与“事件监听”类似,但是明显优于后者。因为可以通过查看消息中心,了解存在多少信号,每个信号有多少订阅者,从而监控程序的执行
promise 是什么
Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。Promise 可以让异步操作写起来,就像在写同步操作的流程,而不必一层层地嵌套回调函数。
Promise 并不能消灭回调地狱,但是它可以使回调变得可控
网友评论