Я программировал несколько лет, но я новичок в JavaScript. Я пытаюсь создать хакерскую версию стандартной функции «уведомлять» потока. Я запускаю ряд запросов данных ajax, каждый из которых занимает около 200 миллисекунд для выполнения, и мне нужно дождаться завершения их ВСЕ, прежде чем выполнять действие (рисование графика).javascript - Передача аргументов объекта setInterval
Мое решение состояло в том, чтобы каждый поток приращивал глобальную переменную, когда закончил. Затем я создал таймер, используя setTimeout, чтобы проверять каждые 100 миллисекунд, чтобы увидеть, обновили ли все потоки переменную, и если они были, для выполнения действия.
Несмотря на то, что он немного взломан, это сработало.
Быстрая перемотка вперед на несколько недель в будущее, и моя программа растет, и теперь нам нужно быть , способным иметь несколько графиков на одной странице, каждый из которых управляет своими данными независимо, используя вышеупомянутые запросы ajax, так как а также несколько страниц, которые используют графики. Поэтому я извлекаю код графического кода в модуль с require.js и определяю класс, который выполняет графическое отображение, чтобы изолировать каждый граф от других, но внезапно setInterval не работает. Я сделать некоторые Googling и найти в следующей статье, которую я вроде понимаю ...
Так или иначе, кажется, что «это» становится окно для какой-то странной причине, когда используется setInterval, и поэтому его не вижу моих методов.
В любом случае, я попытался создать var inst, чтобы содержать это «явно», что, казалось, помогло, но по какой-то причине ему не нравится передавать «inst» в качестве аргумента в рекурсивном вызове. Сообщение об ошибке из консоли Firebug это:
отсутствует] после того, как список элементов [Перерыв на этой ошибке]
} (9,9, [объект Object]))
Вот пример из мой код:
var inst = this;
// some code... then in a function...
function(){
inst.waitUntil(10, inst);
}
inst.waitUntil = function(how_many_seconds, inst){
if (how_many_seconds < 0){
alert("Script timed out.");
return;
} else {
if (inst.allSchoolsLoaded()){
setTimeout("("+inst.draw+"("+inst.after+"))", 100);
} else {
var argString = "("+inst.waitUntil+"("+(how_many_seconds-0.1)+", "+inst+"))";
//alert(argString);
setTimeout(argString, 100);
}
}
}
Вы можете предположить, что все указанные выше переменные определены ранее в классе.
Я нахожусь на своем конце, любая помощь будет действительно оценена. Если кто-то может предложить лучшее решение проблемы с потоками, которая полностью исключает setInterval, это было бы потрясающе, в противном случае, если вы можете предложить способ заставить setInterval работать или альтернативную функцию, которая тоже будет отличной.
Доступен jQuery, и я не против установки других инструментов, если они помогут.
Большое спасибо заранее,
Alex
Так что же случилось с 'вар completedCalls = 0; function ajaxThreadResult() {... completedCalls ++; } ', а затем проверить, если' finishedCalls == callsMade'? –
см. Этот вопрос и ответов там: http://stackoverflow.com/questions/2130241/pass-correct-this-context-to-settimeout-callback/9298306#9298306 –
Да, это на самом деле то, что я делаю ... . function allSchoolsLoaded() просто проверяет завершенныеCalls == callsMade (с разными именами переменных, очевидно). Проблема заключалась в том, как проверить этот статус с интервалами ... – Alex