Javascript 在外部访问索引值。完成
问题: 作为一名学生,我想拿到最新的分数。他们可能有一些临时的和被接受的标记。临时文件可以编辑,但不能接受。首先,我默认将Javascript 在外部访问索引值。完成,javascript,Javascript,问题: 作为一名学生,我想拿到最新的分数。他们可能有一些临时的和被接受的标记。临时文件可以编辑,但不能接受。首先,我默认将latestResult存储在变量中,该变量可以是临时的,也可以是可接受的。接下来,我将尝试对所有结果进行搜索,以检查最新的已接受结果。最后,我想知道接受的结果存在于I的索引中的哪个。但是,当我在.done中执行console.log时,I的值始终为-1,而当我console.log在for循环之外时,则为空 我正在寻找任何建议,通过这些建议可以在for循环之外访问实例I f
latestResult
存储在变量中,该变量可以是临时的,也可以是可接受的。接下来,我将尝试对所有结果进行搜索,以检查最新的已接受结果。最后,我想知道接受的结果存在于I的索引中的哪个。但是,当我在.done
中执行console.log
时,I的值始终为-1,而当我console.log
在for循环之外时,则为空
我正在寻找任何建议,通过这些建议可以在for循环之外访问实例I from.done的值
代码
var accepted = 0;
for (var i = res.length-1; i >= 0; i--){
connectionResult = res[i];
//latest result
latestResult = res[res.length-1];
var idNew = connectionResult.id;
var filterNew = ['result', 'is', idNew];
var recordNew = 'acceptedresult';
getData({
type: recordNew,
filter: filterNew,
fields: [
'id'
]
}).done(function (items) {
if (items.length > 0) {
accepted = 1;
break; //if accepted is one then stop getData
}
});
} //end for
if(accepted == 0){
var editResultConfirm = confirm("Would you like to edit the Result ?");
if (editResultConfirm == true) {
window.open(editResultUrl,'_blank');
}
}else{
alert("You have an accepted result");
window.open(finalResultUrl,'_blank');
}
问题是您试图在异步函数中读取i
,因此当getdata完成/解析for循环时,for循环已经完成,因此i=-1
您需要做的是正确地使用异步流控制器库,如https://caolan.github.io/async/v3/
或者是你将get数据提取到另一个函数中,并将i
作为一个参数传递给另一个函数
var check = 0;
for (var i = res.length-1; i >= 0; i--){
connectionResult = res[i];
//latest result
latestResult = res[res.length-1];
var idNew = connectionResult.id;
var filterNew = ['result', 'is', idNew];
var recordNew = 'acceptedresult';
var params = {
type: recordNew,
filter: filterNew,
fields: [
'id'
]
};
hackishGetData(params, 1 );
} //end for
function hackishGetData(params, i){
getData(params).done(function (items) {
if (items.length > 0) {
check = i;
console.log("check: ",i);
//break;
}
});
}
我不推荐那种粗俗的方式
var check = 0;
for(var i = ...
相当于
var check = 0;
var i;
for(i = ...
i
变量的作用域没有限定在for循环中,因为var
没有块作用域和get,所以回调函数使用的i
的值在回调函数内部求值时已减至-1
您可以使用,它是块范围的,不会被提升:
var检查=0;
对于(设i=res.length-1;i>=0;i--){
connectionResult=res[i];
//最新结果
latestResult=res[res.length-1];
var idNew=connectionResult.id;
var filterNew=['result','is',idNew];
var recordNew='acceptedresult';
获取数据({
类型:recordNew,
过滤器:过滤器新,
字段:[
“身份证”
]
}).完成(功能(项目){
如果(items.length>0){
检查=i;
控制台日志(“检查:”,i);
//中断;
}
});
}//结束
控制台日志(检查)//display empty
在getData之前添加一个const idx=i,并使用idx而不是i,或者以某种方式强制立即计算回调函数中的i(该函数仅已声明且未调用,因此尚未计算i)。我船正在吊装中。这就像在for循环之前有一个var i,所以当完成时,i的值被减到-1,这能回答你的问题吗?或者使用let i=res.length-1
而不是var i(let可以被限定为块,而var被提升),感谢您的清晰解释,这是有意义的!我的部分问题也是关于能够从.done
访问for循环
外部的check
的值。遗憾的是,这种情况仍然没有发生,我得到了0。你们知道这是否可以访问吗?关键的一点是,根据定义,在你们尝试使用它之前,检查必须准备好。任何试图使用它的代码都必须知道等待它。在尝试访问check变量之前,需要钩住回调或返回的承诺。您应该做的是返回一个包含check变量的承诺,并从中提取check。任何试图使用check的代码都需要等待该承诺得到解决,或者至少在done回调完成后才执行(例如在done回调结束时调用使用check的代码)。很难说您实际应该做什么,因为代码过于简单,没有显示您实际需要的内容。console.log(check)可以放在done中,或者您可以从done调用和Promise.all([array of promissions])返回承诺。然后(()=>console.log(check))
,或者将整个过程转换为async/wait。还有一个问题,您为什么要尝试访问check?我想不出一个对它有用的用例。getData()可以根据请求返回的时间以任何顺序返回,如果I/O花费的时间更长或更短,check可以从3跳到0到10到50再跳到6到1,并且取决于您在事件循环中的位置,它可以是这些值中的任何一个。它不可能真的对您有用吗?好吧,我想做的是,如果我从搜索中得到任何结果,并且有一个正确的I
实例,则覆盖latestResult=res[check]
。知道它可以在for循环之外访问是很有用的,因为之后,我可以对正确的latestResult
值执行进一步的操作。例如:是否可以编辑latestResult
。