Javascript语言的执行环境是“单线程”,Javascript语言将任务的执行模式分成两种:同步和异步。
- “同步模式”就是上一段的模式,后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的;
- "异步模式"则完全不同,程序的执行顺序与任务的排列顺序是不一致的、异步的。
- "异步模式"非常重要。在浏览器端,耗时很长的操作都应该异步执行,避免浏览器失去响应,最好的例子就是Ajax操作。
下面看阮一峰的异步编程的四种方法:
一、回调函数
把函数作为参数传入到另一个函数中。这个函数就是所谓的回调函数。
假设有两个函数,f1很耗时,在同步模式下,f2只能等f1执行完毕后再执行
function f1(){console.log(1)}
function f2(){console.log(2)}
f1()
f2()
//1
//2
如果我们希望f2在f1执行结束后立刻执行
function f2(){console.log(2)}
function f1(callback) {
console.log(1)
callback()
}
f1(f2)
//1
//2
setTimeout()函数支持异步处理,如果我们希望f1延迟执行
function f2(){console.log(2)}
function f1(callback){
setTimeout(function() {console.log(1)}, 1000)
callback()
}
f1(f2)
//2
//1
二、事件监听
异步任务的执行不取决于代码的顺序,而取决于某个事件是否发生。
三、发布/订阅
我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。
四、promise
看promise
另外,ES2017 标准引入了 async 函数,使得异步操作变得更加方便。