Javascript 在回调函数中访问全局变量
我面临一个与变量范围相关的问题。最初将“successCount”和“failedCount”变量设置为“0”,并在每次成功/失败迭代后增加该值。但是迭代之后,只得到这些变量的初始值Javascript 在回调函数中访问全局变量,javascript,node.js,Javascript,Node.js,我面临一个与变量范围相关的问题。最初将“successCount”和“failedCount”变量设置为“0”,并在每次成功/失败迭代后增加该值。但是迭代之后,只得到这些变量的初始值 var successCount = 0; var failedCount = 0; var counter = 0; var data = {}; for (var i = 0; i < 5; i++) { updateField(data, (response) => { i
var successCount = 0;
var failedCount = 0;
var counter = 0;
var data = {};
for (var i = 0; i < 5; i++) {
updateField(data, (response) => {
if (response.status) {
successCount++;
} else {
failedCount++;
}
});
counter++;
}
任何解决方案或我对该代码的错误
提前感谢因为变量在回调中更新,所以您需要确保在回调之前未调用console.log 您可以尝试将更新函数转换为一个承诺,即在解析所有函数后能够运行控制台日志
var successCount=0;
var failedCount=0;
var计数器=0;
变量数据={};
函数asyncUpdateField(数据){
返回新承诺((解决)=>{
updateField(数据,(响应)=>{
如果(响应状态){
successCount++;
}否则{
失败计数++;
}
解决();
});
});
}
const promisesUpdateField=[];
对于(变量i=0;i<5;i++){
push(asyncUpdateField(数据));
}
promisesUpdateField.then(()=>{
console.log(successCount);//值仍然为0
console.log(failedCount);//值仍然为0
});代码>看起来,函数updateField
可能是异步的。这就是为什么在执行该函数之前调用console.log()
,此时successCount
和failedCount
的值为0
您确定调用在updateField
匿名函数中进行吗?您是否也可以粘贴“响应是如何产生的”updateField
函数如果我看得正确,您永远不会定义变量cnt。您必须检查变量计数器,而不是cnt。试试看:)@SagarChilukuri类似{status:false,response:'Failed/Success'}的响应很可能是异步的updateField
,请看这不是变量范围问题。这是由于节点的异步性质造成的。您将在Node.js中找到许多关于如何使用异步代码的示例
if(counter === 5) {
console.log(successCount);// Value is still 0
console.log(failedCount);// Value is still 0
}