控制循环处理的速度

时间:2014-05-09 10:30:27

标签: javascript

这是问题, 我有一些java code runs server60seconds每个60seconds选择client side个数据,构建一个对象每一个,然后将其添加到列表中。

现在javascript我有一些setTimeout 调用服务器上的方法并返回对象列表。这些对象每个都代表一个需要移动到屏幕上某个位置的图像。

现在我遇到了这个问题。我有 60秒来循环通过这些对象并将图像设置为正确的位置。现在,当我尝试循环时,它几乎立即循环,所有图像只出现在起始位置。这告诉我的是函数我调用动画没有时间完成,因为对该函数的另一次调用正在打断它。

如何进行控制这样,无论大小如何,我总是在 60秒内完成列表?

ps ...我试过function dataServer() { $.getJSON("/service/data/message", function(data) { if(data) { msgs = data; check = true; counter = 0; var total = data.length; waitTime = (60000 / total) - (8 * delay); for(var message in data) { var latLng = new google.maps.LatLng(-54.75, 148); var marker = new google.maps.Marker({ position: latLng, map: map, optimized: true, icon: new google.maps.MarkerImage( image , undefined, undefined, undefined, new google.maps.Size(85, 60)) }); position = [-55, 148]; result = [ data[message].x, data[message].y ]; i = 0; deltaLat = (result[0] - position[0])/numDeltas; deltaLng = (result[1] - position[1])/numDeltas; var w = 85; var h = 60; var shrinkW = w / 2; var shrinkH = h /2; var shrinkDeltaW = shrinkW / numDeltas; var shrinkDeltaH = shrinkH / numDeltas; var deltaW = w / numDeltas; var deltaH = h / numDeltas; var toSet = true; function moveMarker(result){ position[0] += deltaLat; position[1] += deltaLng; if(i % 4 == 0) { w -= deltaW; h -= deltaH; } var latlng = new google.maps.LatLng(position[0], position[1]); marker.setPosition(latlng); marker.setIcon(new google.maps.MarkerImage( image , undefined, undefined, undefined, new google.maps.Size(w, h))); if(i == (numDeltas - 1)) { var latlng = new google.maps.LatLng(data[message].x, data[message].y); marker.setPosition(latlng); i++; } if(i!=numDeltas){ i++; if(markerArray.length > 10) { shrinkW -= shrinkDeltaW; shrinkH -= shrinkDeltaH; markerArray[0].setIcon(new google.maps.MarkerImage( image , undefined, undefined, undefined, new google.maps.Size(shrinkW, shrinkH))); if(i == (numDeltas -1)) { markerArray[0].setIcon(new google.maps.MarkerImage( image , undefined, undefined, undefined, new google.maps.Size(85, 60))); markerArray[0].setMap(null); markerArray.splice(markerArray[0], 1); feature = map.data.getFeatureById(dataArray[0].countryCode); if (feature) { feature.setProperty('colour', dataArray[0].opacity); } else { } dataArray.splice(dataArray[0], 1); } } delay = waitTime / 8; setTimeout(moveMarker, delay); } } moveMarker(result); markerArray.push(marker); dataArray.push(data[message]); } } else { dataServer(); } }); if(check == false) { counter++; if(counter == 100) { window.location.href = "/intermission.htm"; } } check = false; } 无济于事 程序客户端真的不是我强大的一面

As Requested,收到的json是一个对象数组

{{1}}

1 个答案:

答案 0 :(得分:0)

你可以像你说的那样使用setInterval(),然后在这个时间间隔到期时中断循环。 像:

var stop = false,
    interval = setInterval(function(){
        stop = true;
    }, 60000);

var items = []; // your list.
for(var i=0, y=items.length; i<y; i++){
    // Do stuff

    if(stop){ break; }
}