0

私はそのような一般的な辞書を持っています:データは辞書(キー、値)のペアを保持します:

for (var key in data) {
  var interval = setInterval(function () { 
    getProgress(key, data[key], interval) }, 2500); // get percent progress every sec.
  }
}

各 data[key] アイテムに対して実行する必要がある getProcess 関数

    function getProgress(machineId, operationId, interval) {
        alert(machineId);
        $.post("@Url.Action("Status","Packages")", { 
            machineId: machineId, 
            operationId: operationId 
            }, function (data) {
                if (data) {
                    //blah blah...
                } else { 
                    clearInterval(interval); }
                }
            }
        });
    }

何らかの理由で、最後の machineId get の setInterval のみ。各データ項目に対して個別に setInterval が必要です。

4

4 に答える 4

3

データの配列にforEachループを実装するときに、同じ問題に直面しました。この問題を克服するために、私は単純にforループの基本的な方法を実装します。

for(var key;key<data.length;key++)
{
  var interval = setInterval(function () 
  { 
    // get percent progress every sec.
    getProgress(key, data[key], interval) 
  }, 2500);
}

また、反復ごとにプライベートスコープを作成するソリューションと同様です。

于 2012-11-07T17:13:50.127 に答える
3

古典的な for ループ スコープの問題。for ループの各反復は同じスコープで実行されるため、for ループ内で作成されたすべての関数は同じkey変数にアクセスします。

簡単な解決策は、反復ごとにプライベート スコープを作成することです。

for ( var key in data ) {
    (function (key) {
        var interval = setInterval(function () { 
            // get percent progress every sec.
            getProgress(key, data[key], interval) 
        }, 2500); 
    })(key);
}
于 2012-11-07T16:33:40.247 に答える
1

すべてのコールバックが同じkey変数を共有しています。

コードをIIFEでラップする必要があります。

for (var dontUse in data) {
    (function(key) {
        var interval = setInterval(function () { getProgress(key, data[key], interval) }, 2500); // get percent progress every sec.
    })(dontUse);
}
于 2012-11-07T16:32:03.590 に答える
-1

ループ内で毎回データとキーがコピーされるように、追加の関数を作成する必要があります。

function func(key, data)
{
  var interval = setInterval(function () { getProgress(key, data, interval);  }, 2500);
}

for (var key in data) {
  func(key, data);
}

setInterval が async であるために発生します

于 2012-11-07T16:32:59.813 に答える