在进入内容之前引出一个关于找黄牛买票情景:
1. 让黄牛去买票,然后站着等
2. 让黄牛先去买票,然后去饭店吃饭
3. 让黄牛先去买票,然后去饭店吃饭,让黄牛买到了票,call me back
1. 异步 —— 【不等结果】出来,直接执行下一步代码,买票第二个情景就是 异步
相对于异步,同步就是坐等结果,结果不出来就不会执行下一步,买票第一个情景就是 同步
- 异步编程 —— 不同于同步编程的请求-响应模式,其是一种事件驱动编程,请求调用函数或方法后,无需立即等待响应,可以继续执行其他任务,而之前任务响应返回后可以通过状态、通知和回调来通知调用者。
代码实例:
```
//fn1只有一个任务,定闹钟,因为是闹钟,所以闹钟里的执行语还没开始,就会执行fn2函数,这里fn1就是异步任务
function fn1(){
setInterval(() =>{
//执行语句(一般为循环语句)
},1000)
}
fn1()
fn2(){
//执行语句
}
```
-
同步编程 —— 即是一种典型的请求-响应模型,当请求调用一个函数或方法后,需等待其响应返回,然后执行后续代码。一般情况下,同步编程,代码按序依次执行,能很好的保证程序的执行,但是在某些场景下,比如读取文件内容,或请求服务器接口数据,需要根据返回的数据内容执行后续操作,读取文件和请求接口直到数据返回这一过程是需要时间的,网络越差,耗费时间越长,如果按照同步编程方式实现,在等待数据返回这段时间
-
上面代码中怎么知道闹钟里的执行语句执行完了,并拿到执行结果?这是就用到回调,请看下面内容
2. 回调 —— 拿到异步结果的一种方式,买票第一三个情景就是 回调
【注意】回调也可以拿到同步结果,回调和异步不是同一个概念,只是经常在一起用。
回调代码示例1:
function fn1(input,fn){
setInterval(() =>{
//执行语句(一般为循环语句)
fn.call()
},1000)
}
fn1(input1,()=>{ //异步回调 call back function
fn2(()=>{
})
})
function fn2(fn3){ //同步任务里的回调
//执行语句
fn3.call()
}
回调代码示例2:
//函数执行顺序是先 a 在执行 b
function a(fn) {
//a函数任务...
setTimeout(function() {
fn();
}, 0);
console.log('a');
}
function b(fn) {
//b函数任务
console.log('b');
}
a(b);