Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在外部访问索引值。完成_Javascript - Fatal编程技术网

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