nodejs_回调函数的理解
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");
}
可以自己去跑一遍代码查看结果,对比分析很明显。