Хорошо, я думал, что все это setTimeout идеально, но я, кажется, ужасно ошибался.
Я использую excanvas и javascript, чтобы нарисовать карту своего родного штата, однако процедура рисования блокирует браузер. Прямо сейчас я вынужден потакать IE6, потому что я работаю в большой организации, что, вероятно, является большой частью медлительности.
Итак, я решил создать процедуру под названием «распределенныйDrawPolys» (вероятно, я использую неправильное слово, так что не обращайте внимания на слово «распределенный»), которая, по сути, выталкивает полигоны из глобального массива, чтобы отрисовать 50 полигонов. из них за раз.
Это метод, который помещает полигоны в глобальный массив и запускает setTimeout:
for (var x = 0; x < polygon.length; x++) {
coordsObject.push(polygon[x]);
fifty++;
if (fifty > 49) {
timeOutID = setTimeout(distributedDrawPolys, 5000);
fifty = 0;
}
}
Я поставил предупреждение в конце этого метода, он выполняется практически за секунду.
Распределенный метод выглядит так:
function distributedDrawPolys()
{
if (coordsObject.length > 0) {
for (x = 0; x < 50; x++) { //Only do 50 polygons
var polygon = coordsObject.pop();
var coordinate = polygon.selectNodes("Coordinates/point");
var zip = polygon.selectNodes("ZipCode");
var rating = polygon.selectNodes("Score");
if (zip[0].text.indexOf("HH") == -1) {
var lastOriginCoord = [];
for (var y = 0; y < coordinate.length; y++) {
var point = coordinate[y];
latitude = shiftLat(point.getAttribute("lat"));
longitude = shiftLong(point.getAttribute("long"));
if (y == 0) {
lastOriginCoord[0] = point.getAttribute("long");
lastOriginCoord[1] = point.getAttribute("lat");
}
if (y == 1) {
beginPoly(longitude, latitude);
}
if (y > 0) {
if (translateLongToX(longitude) > 0 && translateLongToX(longitude) < 800 && translateLatToY(latitude) > 0 && translateLatToY(latitude) < 600) {
drawPolyPoint(longitude, latitude);
}
}
}
y = 0;
if (zip[0].text != targetZipCode) {
if (rating[0] != null) {
if (rating[0].text == "Excellent") {
endPoly("rgb(0,153,0)");
}
else if (rating[0].text == "Good") {
endPoly("rgb(153,204,102)");
}
else if (rating[0].text == "Average") {
endPoly("rgb(255,255,153)");
}
}
else { endPoly("rgb(255,255,255)"); }
}
else {
endPoly("rgb(255,0,0)");
}
}
}
}
}
Изменить: исправил формат
Поэтому я подумал, что метод setTimeout позволит сайту рисовать полигоны группами, чтобы пользователи могли взаимодействовать со страницей, пока она рисуется. Что я здесь делаю неправильно?