2

Is JavaScript guaranteed to be single-threaded? しかし、javascriptがシングルスレッドであることは明らかですが、まだ注意が必要です。場合は、そのクリックイベントと中断の間で可能性があり、私は(私はjQueryの「を使用して」だ)次の擬似コードは、常に予測可能であるかどうかを疑問に思ったajaxリクエストを取り消す:まだハンドラを実行できるか

var lastReq; 
$('#button').click(function() 
{ 
    if (lastReq) lastReq.abort(); 
    lastReq = $.ajax(...); 
}); 

、サーバーからのデータeventqueueにイベントが送信されました。これがアボートの直前に発生した場合は、ajax投稿のsuccesイベントがトリガーされます。 私は実際にこの競合状態をどのようにテストするのか分かりません。

これはどのように考えられますか?または、これをテスト済みの例でテストする方法は?

答えて

1

編集: リクエストを中止するとすぐに、ブラウザはそれ以上リッスンする必要がありません。だから、イベントキューのレスポンスに到達すると、私はそれを投げ捨てるべきだと考えています。


あなたはそれで問題を抱えている場合は、あなたが次のことを試みることができる:それはそれはもはや必要が検出されなかった場合

は、あなたが自分自身をキャンセルするあなたの成功の機能+ URLのチェックを行うことができます走る?例えば

(と私はあなたがこのようにそれを行う必要がありますとは言わないよ、私はjqXHR要求には何も付けしようとしていない):

var numReq = 0, lastReq; 

$('#button').on('click', function(e) { 
    if (lastReq) { lastReq.abort(); } 
    numReq ++; 
    lastReq = $.ajax({ 
     success : function(d, s, x) { 
      if (x.reqNum < numReq) { return; } 
     } 
    }); 
    lastReq.reqNum = numReq; 
}); 

私の理解では、Ajaxのイベントはなりませんですあなたは(理論的に)AJAX後のreqnumの設定について心配する必要はありませんので、ボタンのクリック後までイベントキューに追加を


は、私はまた、次のコードを試してみた...、行われます。

var numReq = 0, lastReq, timer = 100, 
    c = setInterval(function() { 
     if (lastReq) { lastReq.abort(); } 
     numReq ++; 
     lastReq = $.ajax({ 
      url  : 'index.html', 
      cache : false, 
      success : function(d, s, x) { 
       if (x.reqNum < numReq) { console.log('it happens'); } 
      } 
     }); 
     lastReq.reqNum = numReq; 
    }, timer); 

ページの読み込み時間を(可能な限り)試行して一致させるタイマーを変更します。私は "それが起こった"ことを表示していない。

1

利用可能state()方法を持って、この回避策が本当に役に立つと防弾ことができれば、私は知りません(私は創造的であることをしようとしている)が、、jQueryのため、1.5 Ajaxの方法は、繰延オブジェクトlastReqを返します

deferred.state()メソッドは、Deferredオブジェクトの現在の状態を表す文字列を返します。を「解決」

...

::繰延オブジェクトがそのdeferred.resolve()またはdeferred.resolveWith(いずれかを意味し、解決した状態にある繰延オブジェクトは、次の3つの状態のいずれかになります)がオブジェクトに対して呼び出され、doneCallbacksが(または呼び出されている)のと呼び出されました。

は、あなたが、これは上で動作するためにあなたのアイデアを与えることを助けることができるので、

var lastReq; 
$('#button').click(function() { 
    if (lastReq) { 
     if (lastReq.state() === "resolved") { 
      return false; /* done() of the previous ajax call is in the process of 
           being called. Do nothing and wait until the state 
           is resolved */ 
     } 
     else { 
      lastReq.abort(); 
     } 
    } 

    lastReq = $.ajax(url).done(function() { 
      /* do something */ 
      lastReq = null; 
    }); 
}); 

希望のようにコードをリファクタリングできますが、私は本当に回避策

のこの種の必要ありません疑います
関連する問題