2

GET メソッドで一連の URL を ping するスクリプトがあります。それぞれに 1 回だけ ping を実行するだけで、応答は期待できません。私のスクリプトは Chrome と Safari で動作しますが、Firefox はそれ以降の要求を完了しません。

Firefox が一連の呼び出し (正確には 5 回) を 1 回ずつ行い、失敗しても気にしないようにする方法はありますか? 最初のリクエストが失敗すると、Firefox は一連のリクエストを完了しないようです。

私は javascript と jQuery で作業しており、少し jQuery.ajax() がスローされています。検索しても役に立たず、初心者のスキルセットの限界に達しました。任意の洞察をいただければ幸いです。

(全範囲に興味がある場合は、jquery ベースのスタンドアロン ポート ノッカー にコードがあります)

ありがとうございました。


アップデート:

さらに調査した結果、問題は Firefox が呼び出しを完全に非同期で処理していないことにあると思います。Chrome と Safari で動作するように、img 呼び出し、iframe url 呼び出し、および ajax 呼び出しで ping を実行するコードのバージョンがありますが、Firefox では必要に応じて動作しません。

ノック シーケンスのサーバー モニタリングでは、リクエストがポート 1、2、3、4、5 に順番に送信されることを確認する必要があります (Chrome または Safari を使用している場合と同様)。ただし、Firefox では、どの方法を試しても、最初のポート 1 に 2 回、次にポート 2 に ping を試行し、その後の試行ではポート 1 にのみ ping を実行します。ステータスの更新は期待どおりに表示されますが、サーバーは必要な順序で呼び出しを受信して​​いません。Firefox は、失敗した呼び出しを順番に 1 回ずつ実行するのではなく、再試行しているようです。

これは、単純な jquery.ajax 呼び出しメソッドを使用したスクリプトのサンプルです。Safari と Chrome では機能しますが、Firefox では期待どおりの結果が得られません。すべてのコードが実行され、(jquery.append 関数で生成された) ステータスの更新を確認できますが、リクエストはサーバーに順番に 1 回ずつ送信されません。

<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('button').click(function(){
    $('#knocks').append('<p>Knocking...</p>');
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:1111'});
        $('#knocks').append("<p>Knock 1 of 5 complete...</p>");
        }, 500);    
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:2222'});
        $('#knocks').append("<p>Knock 2 of 5 complete...</p>");
        }, 3500);
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:3333'});
        $('#knocks').append("<p>Knock 3 of 5 complete...</p>");
        }, 6500);
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:4444'});
        $('#knocks').append("<p>Knock 4 of 5 complete...</p>");
        }, 9500)
    setTimeout(function(){
        $.ajax({url: 'https://example.sample.com:5555'});
        $('#knocks').append("<p>Knock 5 of 5 complete...</p>");
        }, 12000);
    setTimeout(function(){
        $('#knocks').append("<p>Knocking is complete... <br>Proceed to site: <a href='http://example-url.sample-url.com'>http://example-url.sample-url.com</a></p>");
        }, 13000);
});
});
</script>
4

1 に答える 1

0

あなたの質問に対する本当の答えはなく、先に進みたいと思うかもしれませんが、出発点としていくつかの提案をします.

関数呼び出しを順次 (またはsynchronousin-orderblockingなど) で真に実行するには、進行中の要求が完了したら、後続のすべての関数呼び出し (この場合は AJAX 要求) を発行する必要があります。 (成功または失敗のいずれかです。この場合、次の順序どおりの呼び出しに進み、完全に別の応答を発行したくない場合があります)。

現在行っている方法は同期とは見なされず、実際には非同期であり、遅延しています(または「バックグラウンドで」タイムアウトあり)。これは、AJAX 呼び出しがサーバー側で同期的に実行される (ブロックされる) と予想される場合に、あらゆる種類の問題を引き起こす可能性があります。ブラウザが失敗またはタイムアウトしたリクエストを再発行することから (さまざまな理由で、機能セットや失敗したリクエストの処理方法、キャッシュなどに応じて)、プリフェッチャーが有効になっている場合にプリエンプティブにリクエストを発行し、結果をキャッシュすること (またはただし、彼らはそれを FF で呼び出しています)、プリフェッチャーが失敗した場合はそれらを再発行します。これは Firefox で観察されたものと似ており、この予期しない動作の主な原因である可能性があります。エンド ユーザーがブラウザーで有効または無効にする機能や、将来のバージョンで実装する新機能を制御することはできません。setTimeout、他のブラウザでそうしているように見える場合でも(おそらく、サーバーがそのように見えるほど速く応答するためです)。

コードでは、2 番目の呼び出しは最大 0.5 秒、3 番目の要求は最大 3 秒半、というように同期的に実行されているように見えます (最初の呼び出しが完了するのを待っています)。しかし、setTimeout実行をブロックしていたとしても (そうではありません)、どの外部要求を待っているのでしょうか? 最初のもの、または2番目のもの?私が言おうとしていることと、コードが期待どおりに機能しない理由がわかると思います。

代わりに、サーバーの応答を介して後続の AJAX 呼び出しを発行する必要があります (これが実際に AJAX を使用するポイントであり、それ以外の場合は必要ありません)、できれば、ステータスに応じてこれらの呼び出しを処理する外部リスナー関数を作成する必要があります。または、以前の外部呼び出しの値を返します。失敗したリクエストも処理し、それにもかかわらず実行を継続する必要がある場合は、失敗したリクエストの応答に依存できないことは明らかであるため、外部リスナー (実行スタックのタイムアウトが事前設定されている) が適しています。

おわかりのように、ブラウザは複数の同時リクエストを問題なく発行し、それらを遅延させても、setTimoutプリフェッチャーが後で使用するためにレスポンスをキャッシュしようとするのを止めません。また、ブロックする方法でリクエストを発行することもありません。次のリクエストは、前のリクエストが完了するのを待っています。ほとんどの人は、ダウンロードやページ レンダリング プロセスを高速化するために、一定数の同時接続 (クライアント マシンでは最大 10、サーバーではそれ以上) を喜んで利用します。これとまったく同じ理由で、キャッシング メカニズムが導入されています。Firefox はその 1 つにすぎません。

これで問題が少し解決し、コードを書き直して期待どおりに動作するようになることを願っています。ただし、サーバー側のコードがどのように機能するかについてはわかっていないため、自分で作成する必要があります。ただし、SE には、使用を決定する可能性のある同様の手法について議論しているスレッドがたくさんあります。行き詰まった場合は、いつでも別の質問をすることができます。喜んでお手伝いします。

乾杯!

于 2013-02-27T21:30:02.300 に答える