• 异步编程 -- 回调函数


    函数也是一种数据类型,既可以当做参数传递,也可以当做方法值返回,函数在js中是一等公民。
    一般情况下,把函数作为参数的目的就是为了获取函数内部的异步操作结果。

    常见的异步api setTimeout setInterval ajax Promise

    与异步编程相对的是 同步编程

    console.log(1)
    function add(x,y){
        console.log(2)
        return (x+y)
    }
    console.log(add(10,20));
    console.log(3)
    // 返回结果 1 2 30 3

    异步编程

    console.log(1)
    setTimeout(function(){
        console.log(2);
        console.log("hello")
    },100)
    console.log(3)
    // 返回结果 1 3 2 hello

    异步函数 -- 输出返回值  不成立情况 -- 第一种

    function sum(x,y){
        console.log(1)
        setTimeout(function(){
            console.log(2)
            var resault = x + y;
            return resault;  // 这里的return值拿不到
        },100)
        console.log(3)
        // 函数到此就执行结束,不会等待前面的定时器,所以姐直接返回了默认值undefined
    }
    console.log(sum(10,20))   // 1 3 undefined 2

    第二种不成立情况

    function sum(x,y){
        var resault;
        console.log(1)
        setTimeout(function(){
            console.log(2)
            resault = x + y;
        },100)
        console.log(3)
        return resault; //定时器还没有执行到
    }
    console.log(sum(10,20)) // 1 3 undefined 2        

    第一种使用可以拿到值得情况,此方式只是助于理解异步,一般不用于实际开发

    var res ;
    function sum(x,y){
        console.log(1);
        setTimeout(function(){
            console.log(2);
            res = x+y;
        },100)
        console.log(3)
    }   
    sum(10,20);
    setTimeout(function(){
        console.log("res",res)
    },2000); // 此处的时间必须要大于前面的延时器时间

    第二种可以拿到值的方法  -- 使用回调函数

    function sum(x,y,callback){
        /*
        callback 就是回调函数 -->
        var x = 10;
        var y = 100;
        var callback = function(){}
        */
        console.log(1);
        setTimeout(function(){
            console.log(2)
            var resault = x + y;
            callback(resault);
        },200)
        console.log(3)
    }
    
    sum(10,100,function(resault){
        console.log(resault)// 将函数当做参数获取返回值
    })

    回调函数案例

    function getajax(url,callback){
        let xhr = new XMLHttpRequest();
        xhr.open('get',url,true);
        xhr.send();
        xhr.onreadystatechange = function(){
            if(xhr.readyState === 4 && xhr.status === 200 ){
                console.log(xhr.responseText);
                // 回调函数的调用
                callback(xhr.responseText)
            }
        }
    }        
    
    // 函数调用
    getajax('url',function(data){
      console.log(data) // 此处可以拿到异步获取的数据
    })
  • 相关阅读:
    搭建App主流框架_纯代码搭建(OC)
    UIApplication,UIWindow,UIViewController,UIView(layer)
    插件类
    VIEWCONTROLLER的启动流程
    UIView你知道多少
    分析UIWindow
    创建控制器的3种方式、深入了解view的创建和加载顺序
    UIViewController的生命周期及iOS程序执行顺序
    ViewController加载顺序与self.view
    GCD
  • 原文地址:https://www.cnblogs.com/rose-sharon/p/11690627.html
Copyright © 2020-2023  润新知