node中以闭包的方式确保异步函数内部变量的正确性

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',执行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值