1

重複の可能性:
関数を setTimeout にループで渡す: 常に最後の値?

次のコードがあります。

var points = [{
        id1             : 1,
        id2             : 9,
        lat             : 44,
        lng             : 24
    },{
        id1             : 2,
        id2             : 7,
        lat             : 13,
        lng             : 29
    }];

配列ポイント内のすべてのオブジェクトに対してタイムアウトを作成しようとすると、最後の要素のみが更新されます

for (var i in points){
    setInterval(function(){
        drivePoint(points[i], i)
    }, 1000);
}

drive point は、ajax リクエストを作成する関数です。

function drivePoint(point, i){
        $.ajax({
            type: "POST",
            url: 'url',
            data: points[i]
        }).done(function(o){
            var data = $.parseJSON(o);
            points[i].lat           = data['lat'];
            points[i].lng           = data['lng'];
        });
    }

drivePoint のアイデアは、特定のポイントの座標を更新することですが、問題は、最後のポイントのみを更新することです。それにもかかわらず、 for (var i in points) ループの代わりにこれを個別に書き込む場合、ポイント変数にオブジェクトがいくつあるかにかかわらず

setInterval(function(){
    drivePoint(points[0], 0)
}, 1000);

setInterval(function(){
    drivePoint(points[1], 1)
}, 1000);

すべてが正常に動作します

どこに問題があるのか​​理解できない

4

1 に答える 1

1

ここでの問題は、関数が実行されるiとループ内の最後の値に設定されるため、実行時にそれが使用されることdrivePoint()です。しかし、ポイントごとに個別の間隔が本当に必要ですか? 代わりに、すべての値を間隔でループさせることはできますか?

setInterval(function() {
    for (var i in points) {
        drivePoint(points[i], i);
    }
}, 1000);
于 2012-09-08T22:21:46.267 に答える