web-dev-qa-db-ja.com

特定のイベントが発生するまでJavaScriptを待機させるにはどうすればよいですか?

私は次の構造のウェブページを書いています:

  1. 1つのセクション(表A)は別のセクション(表B)に依存します。
  2. 別のセクション(表B)には、更新ごとに再計算が必要な要素があります。計算は外部ツールによって処理され、終了するとイベントが発生します。

正確性を保証するために、テーブルは、他のテーブルが完全に更新された後(つまり、計算によって行われた後)にのみ更新する必要があります。ただし、これを効果的に実現する方法がわからず、JavaScript内にwait機能が見つかりませんでした。

今のところ、私は次の方法を使用しています。

  1. グローバル変数updatedを宣言し、それをfalseにします。
  2. 最初のテーブルが入力を受け取った後、whileupdatedになるまで、空のtrueループを作成します。
  3. リスナーを追加します。計算が完了してイベントを受信したら、updatedtrueに設定します。

これは私には直感的ではないように思えますが、他の方法は考えられません。これを行うための良い方法はありますか?

ご入力いただきありがとうございます。

9
zw324

リスナーを追加します。計算が完了してイベントが受信されたら、更新をtrueに設定します。

updatedをtrueに設定してから、updatedがtrueになるのを待つ代わりに、リスナーでやりたいことを何でもします。

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

空の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
}
6
hugomg

更新をトリガーするものすべてに対してコールバック関数を作成できます。面倒なコールバックを回避するために、promiseも使用して、更新操作で取得したデータに応じてテーブルの一部を更新することができます。提案を受け入れます。

0
Soham Bhaumik