如何让JavaScript等到某个事件发生?

时间:2011-08-01 17:51:15

标签: javascript events web-applications wait

我正在撰写一个具有以下结构的网页:

  1. 一个部分(表A)取决于另一部分(表B);
  2. 另一部分(表B)包含需要在每次更新时重新计算的元素。计算由外部工具处理,完成后将导致事件。
  3. 为了保证正确性,只有在另一个表完全更新(即完成计算)之后才需要更新表。但是,我不知道如何有效地实现这一点,我在JavaScript中找不到任何wait工具。

    目前,我使用以下方法:

    1. 声明全局变量updated并将其设为false;
    2. 在第一个表收到输入后,我创建一个空的while循环,直到updatedtrue;
    3. 添加一个监听器,一旦完成计算并收到事件,将updated设置为true
    4. 这对我来说似乎不直观,但我想不出任何其他方式。有没有什么好方法可以做到这一点?

      感谢您的任何意见!

3 个答案:

答案 0 :(得分:6)

  

添加一个监听器,一旦完成计算并收到事件,将更新设置为true。

而不是将updated设置为true,然后等待updated为真 - 只需在侦听器中执行您想做的任何事情。

myEventBus.addListener(function () {
    // do whatever
    updateTable();
    alert('table updated!');
});

答案 1 :(得分:5)

做空的while循环是个坏主意。您不仅要刻录CPU周期,而且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
}

答案 2 :(得分:0)

您可以为更新触发器编写回调函数。为了避免混乱的回调,您也可以使用promises,并根据更新操作中检索的数据更新表的某些部分。接受建议。