美文网首页
nodejs_回调函数的理解

nodejs_回调函数的理解

作者: 李二狗的星球 | 来源:发表于2018-06-29 10:12 被阅读0次

    nodejs中的函数回调直接体现了nodejs的异步的思想,从java写到nodejs,这种思想可能比较影响对代码的走读。

    http://www.runoob.com/nodejs/nodejs-callback.html

    在js中,写一个函数,该函数的入参可以是一个对象,变量也可以是一个函数。特点就是将函数作为入场写入了函数中,也就是说变量和函数是有着同等的地位的。

    先看一个典型的回调函数:

    function getTopics(appData, (err, topics)=>{

                            if(err || topics.length=== 0){

                                Err("getTopics err. err: " + err + ", appData: " + JSON.stringify(appData) + ", topics: " + JSON.stringify(topics));

                                return;

                            }

    appdata是一个入参,既可以是变量,也可以是对象。此处的回调函数是用lambda表达式写的,函数的返回值是err或者topics,也可以改写为正常的函数表达式,但是一般在js中用lambda表达式去写回调函数用的比较多,实际上也比较方便。

    function getTopics(appData,function (err, topics){

                            if(err || topics.length=== 0){

                                Err("getTopics err. err: " + err + ", appData: " + JSON.stringify(appData) + ", topics: " + JSON.stringify(topics));

                                return;

                            }

    而最难理解的应该是在回调函数的入参和返回值,以及回调函数执行的时间和结果。先看一个例子:

    ss = setInterval(()=>{

        let a = "y"

        execute(a,(a)=>{

            console.log("n:"+a);

        });

        clearInterval(ss);

    },1000);

    function execute(a,cb){

        // setTimeout(() => {

        //    console.log("m:"+a);

        //    a = "xxx";

        // }, 1000);

        console.log("m:"+a);

        a = "xxx";

        return cb(a);

    }

    以及

    ss = setInterval(()=>{

        let b = "y"

        let x = 1;

        let y = 2;

        execute(b,(x,y)=>{

            console.log("b:"+b);

            console.log("x:"+x);

            console.log("y:"+y);

            x = 3;

            y = 4;

        });

        console.log("x:"+x);

        console.log("y:"+y);

        clearInterval(ss);

    },1000);

    function execute(a,cb){

        setTimeout(() => {

            console.log("a:"+a);

            a = "xxx";

        }, 1000);

        // console.log("a:"+a);

        // a = "xxx";

        return cb(a,a);

        // return cb("nihao");

    }

    懒得粘贴各种测试结果了!太多情况了!

    结论:

    execute(b,cb){}函数中包含cb回调函数,cb返回的参数作为execute(b,(x,y)){}x和y的入参。

    如果想修改变量的有效范围,可以定义变量:

    ss = setInterval(()=>{

        let self = this;

        self.b = "y";

        self.x = 1;

        self.y = 2;

        execute(self.b,(x,y)=>{

            console.log("b:"+self.b);

            console.log("x:"+x);

            console.log("y:"+y);

            self.x = 3;

            self.y = 4;

        });

        console.log("b:"+self.b);

        console.log("x:"+self.x);

        console.log("y:"+self.y);

        clearInterval(ss);

    },1000);

    function execute(a,cb){

        // setTimeout(() => {

        //    console.log("a:"+a);

        //    a = "xxx";

        // }, 1000);

        console.log("a:"+a);

        a = "xxx";

        return cb(a,a);

        // return cb("nihao");

    }

    可以自己去跑一遍代码查看结果,对比分析很明显。

    相关文章

      网友评论

          本文标题:nodejs_回调函数的理解

          本文链接:https://www.haomeiwen.com/subject/kppoyftx.html