JavaScript 【异步与回调】

228 阅读2分钟

在进入内容之前引出一个关于找黄牛买票情景:

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);