【问题标题】:no delay on settimeout loopsettimeout 循环没有延迟
【发布时间】:2016-11-15 16:39:38
【问题描述】:

我有一个函数可以读取一个 csv 文件并计算两种类型的值“Client”和“Helper”之间的距离

function readCSV(e){
    var file = e.target.files[0];
    var helferList =[];
    var kundenList =[];
    if (!file) {
        console.log('file could not be read');
            return;
    }
    var reader = new FileReader();
    reader.onload = function(e) {
            var contents = e.target.result;
            var result = $.csv.toArrays(contents);
        $('.output').append(",");
        for(i = 0; i< result.length; i++){
            if(result[i][0] =="Kunde"){
                kundenList.push(result[i]);
            }
            else if(result[i][0] =="Helfer"){
                helferList.push(result[i]);
                $('.output').append(result[i][1] + " "+ result[i][2] + ", ");
            }
        }
        $('.output').append("\n");
        console.log(kundenList.length);
        for(i = 0; i< kundenList.length; i++){
            $('.output').append(kundenList[i][1] + " "+ kundenList[i][2] + ", ");
            for(j=0; j <helferList.length;j++){
                setTimeout(getDistance(kundenList[i],helferList[j]),500);

            }
            $('.output').append("\n");
        }


    };
    reader.readAsText(file);
}

我遇到的问题是每次距离计算之间必须有延迟。出于这个原因,我使用:

 setTimeout(getDistance(kundenList[i],helferList[j]),500);

但它似乎不起作用,因为计算之间没有延迟

【问题讨论】:

标签: javascript loops settimeout


【解决方案1】:

您必须使用乘法器,因为在您当前的代码中,所有函数都将在 500 毫秒内触发,但不会递增。在for() 执行 500 毫秒后,所有函数都将立即触发。

要改变这个,用这样的标志做一个乘法器:

function readCSV(e){
    var file = e.target.files[0];
    var helferList =[];
    var kundenList =[];
    if (!file) {
        console.log('file could not be read');
            return;
    }
    var reader = new FileReader();
    reader.onload = function(e) {
            var contents = e.target.result;
            var result = $.csv.toArrays(contents);
        $('.output').append(",");
        for(i = 0; i< result.length; i++){
            if(result[i][0] =="Kunde"){
                kundenList.push(result[i]);
            }
            else if(result[i][0] =="Helfer"){
                helferList.push(result[i]);
                $('.output').append(result[i][1] + " "+ result[i][2] + ", ");
            }
        }
        $('.output').append("\n");
        console.log(kundenList.length);
        var k = 0;
        for(i = 0; i< kundenList.length; i++){
            $('.output').append(kundenList[i][1] + " "+ kundenList[i][2] + ", ");
            for(j=0; j <helferList.length;j++){
                // 500 * k = 500 * 1 | 500 * 2 | etc
                setTimeout(getDistance(kundenList[i],helferList[j]),(500 * k++));

            }
            $('.output').append("\n");
        }


    };
    reader.readAsText(file);
}

【讨论】:

  • 只有当我使用匿名函数 setTimeout(function(){getDistance(kundenList[i],helferList[j])},(500 * k++));但是我有一个问题,当传递给 getDistance 时,参数是未知的或为空的。
  • 我没有足够的信息来帮助您解决该错误。我的回答解决了延迟问题。要解决其他问题,请创建一个新问题。
  • 我发现了问题!我必须将 getDistance() 函数作为字符串传递。 setTimeout('getDistance("'+kundenAddress+'","'+helferAddress+'")',(2000 * k++));
  • 这是一个范围问题,很高兴听到它已解决。 :)
猜你喜欢
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多