nodejs_回调函数的理解

2018-06-29  本文已影响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");

}

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

上一篇下一篇

猜你喜欢

热点阅读