Действительно ли JavaScript является единственным, распараллелил? В противном случае, как я получаю синхронизируемый доступ к совместно используемым данным?

Чтобы уточнить причину, вы вычисляете значение промежуточного итога до , когда вы присваиваете значения переменным. В C ++ до тех пор, пока вы не присвоите значение переменной, результат доступа к ней будет основан на том, что когда-либо происходило с записью в этот бит памяти каким-либо другим процессом. Таким образом, вы по существу вычислили значение мусора, а затем попросили пользователя ввести данные. В C ++ часто считается хорошей практикой инициализировать переменные одновременно с их определением.

6
задан 4 revs, 2 users 100% 2 October 2008 в 12:43
поделиться

7 ответов

Да, JavaScript является однопоточным. Даже с браузерами как Google Chrome, существует один поток на вкладку.

Не зная, как Вы пытаетесь отменить одно всплывающее окно от другого, трудно сказать, что является причиной Вашей проблемы.

Если Ваши ОТДЕЛЕНИЯ вкладываются друг в друге, у Вас может быть проблема распространения события.

9
ответ дан 8 December 2019 в 17:31
поделиться

Это является единственным, распараллелил в браузерах. Обработчики событий работают асинхронно в одном потоке, не блокирование не всегда означает многопоточный. Действительно ли одно из Ваших отделений является ребенком другого? Поскольку распространение событий как пузыри в dom дереве от ребенка для порождения.

1
ответ дан 8 December 2019 в 17:31
поделиться

К вашему сведению: С Firefox 3 существует изменение, в значительной степени относящееся к этому обсуждению: порождение потоков выполнения синхронных запросов XMLHttpRequest отсоединяется (это - то, почему интерфейс не замораживается там во время синхронных запросов), и выполнение продолжается. После синхронного завершения запроса его поток продолжается также. Они не будут выполняться одновременно, однако полагаясь при условии, что единственный поток останавливается, в то время как синхронная процедура (запрос) случай больше не применима.

1
ответ дан 8 December 2019 в 17:31
поделиться

Могло случиться так, что дисплей не обновляется достаточно быстро. В зависимости от библиотеки JS Вы используете, Вы смогли помещать крошечную задержку на раскрывающийся "выставочный" эффект.

0
ответ дан 8 December 2019 в 17:31
поделиться

Подобный тому, какой сказанный pkaeding, трудно предположить проблему, не видя Вашу разметку и сценарий; однако, я рисковал бы сказать, что Вы правильно не останавливаете распространение события, и/или Вы правильно не скрываете существующий элемент. Я не знаю, используете ли Вы платформу или нет, но вот возможное решение с помощью Прототипа:

// maintain a reference to the active div bubble
this.oActiveDivBubble = null;

// event handler for the first div
$('exampleDiv1').observe('mouseover', function(evt) {
    evt.stop();
    if(this.oActiveDivBubble ) {
        this.oActiveDivBubble .hide();
    }
    this.oActiveDivBubble = $('exampleDiv1Bubble');
    this.oActiveDivBubble .show();

}.bind(this));

// event handler for the second div
$('exampleDiv2').observe('mouseover'), function(evt) {
    evt.stop();
    if(this.oActiveDivBubble) {
        this.oActiveDivBubble.hide();
    }
    this.oActiveDivBubble = $('exampleDiv2Bubble');
    this.oActiveDivBubble .show();
}.bind(this));

Конечно, это могло быть обобщено далее путем получения всех элементов с, скажем, тем же классом, итерации через них и применения той же функции обработки событий к каждому из них.

Так или иначе надо надеяться, это помогает.

1
ответ дан 8 December 2019 в 17:31
поделиться

Вот рабочая версия, более или менее. При создании объектов мы присоединяем a mouseover событие:

var self = this;
SimileAjax.DOM.registerEvent(labelElmtData.elmt, "mouseover", function (elt, domEvt, target) {
    return self._onHover(labelElmtData.elmt, domEvt, evt);
});

Это вызывает функцию, которая устанавливает тайм-аут (существующий ранее, тайм-ауты для другого объекта отменяются сначала):

MyPlan.EventPainter.prototype._onHover = function(target, domEvt, evt) {            
    ... calculate x and y ...
    domEvt.cancelBubble = true;
    SimileAjax.DOM.cancelEvent(domEvt);
    this._futureShowBubble(x, y, evt);

    return false;
}
MyPlan.EventPainter.prototype._futureShowBubble = function (x, y, evt) {
    if (this._futurePopup) {
        if (evt.getID() == this._futurePopup.evt.getID()) {
            return;
        } else {
            /* We had queued a different event's pop-up; this must now be cancelled. */
            window.clearTimeout(this._futurePopup.timeoutID);
        } 
    }
    this._futurePopup = {
        x: x,
        y: y,
        evt: evt
    };    
    var self = this;
    this._futurePopup.timeoutID =  window.setTimeout(function () {
            self._onTimeout();
    }, this._popupTimeout);
}

Это в свою очередь показывает пузырь, если он стреляет прежде чем быть отмененным:

MyPlan.EventPainter.prototype._onTimeout = function () {
    this._showBubble(this._futurePopup.x, this._futurePopup.y, this._futurePopup.evt);

};

MyPlan.EventPainter.prototype._showBubble = function(x, y, evt) {
    if (this._futurePopup) {
        window.clearTimeout(this._futurePopup.timeoutID);
        this._futurePopup = null;
    }        
    ...

    SimileAjax.WindowManager.cancelPopups();
    SimileAjax.Graphics.createBubbleForContentAndPoint(...);
};

Это, кажется, работает теперь, я установил тайм-аут на 200 мс, а не 100 мс. Не уверенный, почему слишком короткий тайм-аут вызывает мультипузырьковую вещь произойти, но я предполагаю организацию очередей событий окна, или что-то могло бы все еще происходить, в то время как недавно добавленные элементы размечаются.

0
ответ дан 8 December 2019 в 17:31
поделиться

Я не знаю, какую библиотеку вы используете, но если вы пытаетесь отобразить только одну всплывающую подсказку для сортировки за раз ... используйте объект-легковес. По сути, наилегчайший вес - это то, что делается один раз и используется снова и снова. Подумайте об одноэлементном классе. Таким образом, вы вызываете класс статически, который при первом вызове автоматически создает сам объект и сохраняет его. Во-первых, это происходит: все статики ссылаются на один и тот же объект, и из-за этого вы не получаете множественных всплывающих подсказок или конфликтов.

Я использую ExtJS, и они создают всплывающие подсказки и окна сообщений как оба элемента-легковеса. Я надеюсь, что в ваших фреймворках также есть легковесные элементы, иначе вам просто придется создать свой собственный синглтон и вызвать его.

2
ответ дан 8 December 2019 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: