node中异步函数,比如:setTimeout()这样的,其本意是不阻塞当前的操作,待固定时间到了后继续执行setTimeout()里面的内容,如下所示的代码:
// 异步方法
asycFunc = (callback) => {
setTimeout(callback, 500);
};
let color = 'green';
// 调用异步方法:此处会出现数据的脏读
asycFunc(() => {
// 此处color输出的应该是blue而不是期待的green
console.log(`The color is ${color}`);
});
color = 'blue';
如上的代码就是一个异步代码中,出现的一个问题: 本意是希望获取到的color=green的,但是实际却是blue,如下图所示
原因就是:setTimeOut方法中,有个等待0.5秒,但是setTimeOut是非阻塞的:即程序依旧会继续往下执行:color = 'blue',所以才会在最后输出了“The color is blue”的原因!
要想解决这类的问题,可以采用闭包的方式:直接上代码,如下
// 异步方法
asycFunc = (callback) => {
setTimeout(callback, 500);
};
let color = 'green';
// 调用异步方法:此处会出现数据的脏读
asycFunc(() => {
// 此处color输出的应该是blue而不是期待的green
console.log(`The color is ${color}`);
});
color = 'blue';
// 通过闭包的方式获取异步方法中的值
let name = 'guxh';
(name => {
asycFunc(() => {
// 这样,获取到的就是期待的guxh的值
console.log(`The name is ${name}`);
});
})(name);
name = 'cairr';
核心部分就是:以一个参数名为name的匿名函数包着当前的这个异步方法,并把当前的变量:name传给这个匿名函数,匿名函数是立即执行的,所以在异步方法中获取到的变量就是期待的'guxh',而不是'cairr',执行结果如下: