1

2種類のイベントがあるWebページ(javascript)があります。

  • キャンバスでイベントをクリックします(アラートのみを表示します)。
  • 毎秒定期的なイベント(タイマーによって起動されます)。

定期的なイベントは200〜300ミリ秒ビジーです(同期SOAP呼び出しを開始します)。

キャンバスイベント:

var c=document.getElementById("myCanvas");
 c.addEventListener('click', function(e) {alert('Click');},false);

周期表:

var timer1= new Timer(1000,"Refresh()"); // A library call


function Refresh()
{   
    timer1.stop();

    // Synchronous SOAP call would come here

    // with the results we draw the canvas again

    timer1.start();
}

SOAP呼び出しが行われているときにキャンバスをクリックすると、クリックイベントが発生しないか、アラートが表示されないためだと思います。

定期的なイベントが終了し、再度呼び出される前にクリックすると、クリックするたびにアラートが表示されます。

私の知る限り、定期的なイベントの実行中にクリックイベントが生成された場合、もう一方のイベントが終了するまでそれを遅らせる必要があります。

問題の原因は何ですか?

PD私はFirebug(Firefox上)を使用して、SOAP呼び出しがいつ行われるかを知っています。

4

2 に答える 2

4

同期呼び出しは I/O をブロックするため、アラートは発生しません。通話の折り返しを待っているため、その間に発生したアクションは無視されます。

この記事が役に立つかもしれません: http://ejohn.org/blog/how-javascript-timers-work/

ブラウザー内のすべてのJavaScript は単一のスレッドで実行されるため、非同期イベント (マウス クリックやタイマーなど) は、実行に空きがある場合にのみ実行されます。

  • JavaScript エンジンには 1 つのスレッドしかないため、非同期イベントは強制的にキューに入れられて実行を待ちます。
  • setTimeout と setInterval は、非同期コードの実行方法が根本的に異なります。
  • atimer がすぐに実行されないようにブロックされている場合は、次の実行可能ポイントまで遅延されます (これは、必要な遅延よりも長くなります)。
  • 間隔は、実行に十分な時間がかかる (指定された遅延よりも長い) 場合、遅延なしで連続して実行される場合があります。
于 2012-11-30T15:25:43.360 に答える
1

UI イベントと、Javascript で行うその他すべての処理は、デフォルトで単一のスレッドで実行されるため、発生していることは予期されたものです。しかし、これは単なる原因です...

原因を理解したら、解決策を得るまでの道のりは半分です。同期 SOAP 呼び出しが必要な場合、そのように思われますが、別のスレッドを使用する必要があります。Web ワーカーを入力してください ...

新しい Web ワーカーを作成するには、ワーカー スレッドで実行するスクリプトの URI を指定して、Worker() コンストラクターを呼び出します。

var worker = new Worker('my_task.js');

ワーカーから通知を受け取るには、ワーカーの onmessage プロパティを適切なイベント ハンドラー関数に設定します。

worker.onmessage = function(event) {
    console.log("Called back by the worker!\n");
};

詳細については、次を参照してください。

http://en.wikipedia.org/wiki/Web_worker

上記のソースからの引用: Web ワーカーは現在、Safari、Chrome、Opera、Internet Explorer (バージョン 10)、および Mozilla Firefox でサポートされています。Web ワーカーは、iOS 5 の Safari、および Android バージョン 2.0 と 2.1 でサポートされています。

Android のサポートについて: ここを参照してください:バージョン 2.2 以降の Android ブラウザーから HTML5 Web Workers のサポートが削除されたのはなぜですか?

IO を含む例:

https://developer.mozilla.org/en-US/docs/Using_workers_in_extensions

これが問題の解決に役立つことを願っています。

免責事項: 一般に、非同期通信を実行する方法を学ばないようにするのは非常に簡単であり、Web ワーカーはまさにそれを行うための良い方法のように思えるかもしれません。私はそのアプローチを提唱しているわけではありませんが、明らかに代替手段を持っていない人に解決策を提案しているだけです. 非同期通信は、慣れると非常に簡単になり、より良い Web サイトを構築するのに役立ちます。jQuery は、非同期 IO を適切にサポートしています。

于 2012-11-30T15:47:17.797 に答える