Как позволить JavaScript ждать, пока не произойдет определенное событие? - PullRequest
7 голосов
/ 01 августа 2011

Я пишу веб-страницу со следующей структурой:

  1. Один раздел (таблица A) зависит от другого раздела (таблица B);
  2. В другом разделе (таблица B) есть элементы, которые требуют пересчета при каждом обновлении. Вычисления обрабатываются внешними инструментами и по окончании будут вызывать событие.

Чтобы гарантировать правильность, таблицу необходимо обновлять только после того, как другая таблица будет полностью обновлена ​​(т.е. выполнена с помощью вычислений). Однако я не знаю, как эффективно добиться этого, и я не смог найти ни одного средства wait в JavaScript.

На данный момент я использую следующий метод:

  1. Объявите глобальную переменную updated и сделайте ее false;
  2. После того, как первая таблица получила входные данные, я делаю пустой цикл while, пока updated не станет true;
  3. Добавьте прослушиватель, когда вычисление выполнено и событие получено, установите updated на true.

Это кажется мне неинтуитивным, но я не могу придумать другого способа сделать это. Есть ли хорошие способы сделать это?

Спасибо за любые комментарии!

Ответы [ 3 ]

6 голосов
/ 01 августа 2011

Добавьте прослушиватель после завершения расчета и получения события, установите обновленное значение true.

Вместо установки updated в значение true и затем ожидание updatedчтобы быть правдой - просто делай, что хочешь, в слушателе.

myEventBus.addListener(function () {
    // do whatever
    updateTable();
    alert('table updated!');
});
5 голосов
/ 01 августа 2011

Пустые циклы - плохая идея. Вы не только записываете циклы ЦП, но и Javacript является однопоточным, поэтому вы будете выполнять циклы вечно, не давая никому возможности изменить переменную.

Что вы можете сделать, это переписать таблицу, в которой есть другие люди, чтобы она сама "запустила событие". Есть много способов сделать это, но в основном вы просто хотите, чтобы он вызывал функцию «продолжения», а не возвращал вслепую. Эта функция может быть предопределена или вы можете передать ее в качестве параметра где-то.

//this is just illustrative
//Your actual code will be probably very different from this.

function update_part(){
    //do something
    signal_finished_part()
}

var parts_done = 0;
function signal_finished_part(){
    parts_done ++;
    if(parts_done >= 5){
        signal_all_parts_done();
    }
}

function signal_all_parts_done()
{
    //do something to table A
}
0 голосов
/ 07 сентября 2016

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

...