2017-05-04 7 views
0

私はリクエストを行うと、ユーザーの詳細を取得するポストajaxリクエストを行います。レスポンスステータスは0(リソースをロードしようとしてエラーが発生しました)私は自分の問題に関していくつかの投稿を読んだが、それは "クロスドメインステータスを0に戻すと"と書かれたすべてが、私の場合ではない私は同じドメインからリクエストしています。サファリブラウザでランダムにAjaxステータスを0に設定しています

0.Has誰もがこの種の問題に直面したとして、私はステータスを取得するたびにAjaxの送信イベントが発生しません

は?それはSafariブラウザに関連していますか?事前にクロムとfirefox.Thanksで正常に動作するようです

+1

あなたはAjaxリクエストを作るために使用している、関連するコード、そしてあなたが呼んでいるサーバーのコードを投稿してください。私はそれが問題の診断を開始する最善の方法だと言います。 –

答えて

0

私は過去にWebkitベースのブラウザを使って作業しているときにこの問題に直面しました。 Webサーバーで要求トレースが失敗した後、要求がブラウザから送信されていないことがわかりました。 Webブラウザで詳細なデバッグを有効にすると、ブラウザ自体のバグが指摘されました。ブラウザの傑出したバグに直面して、私はついに以下の解決策に着きました。

このコードは、ブラウザから返されたステータスコードが0の場合に、ajaxリクエストを再試行します。それ以外の点については、jQueryのajax関数と同様に機能します。コードが要求の送信を再試行する回数を構成できます。

function AjaxRetry(settings, maxTries, interval) { 
    var self = this; 
    this.settings = settings; 
    this.maxTries = typeof maxTries === "number" ? maxTries : 0; 
    this.completedTries = 0; 
    this.interval = typeof interval === "number" ? interval : 0; 

    return tryAjax().promise(); 

    function tryAjax(deferred) { 
    var d = deferred || $.Deferred(); 
    $.ajax(self.settings) 
     .done(function (data, textStatus, xhr) { 
      self.completedTries += 1; 
      d.resolve(data, status, xhr); 
      self.done = true; 
     }) 
     .fail(function (xhr, textStatus, error) { 

      self.completedTries += 1; 
      var attemptRetry = false; 

      // Added in an attempt to handle the ajax errors that appear to be a flaw in the Intermec HTML5 Browser. 
      // Example error in browser debug log: Curl ERROR: Failed sending data to the peer for url 
      // This appears to be CURLE_SEND_ERROR (55) - Failed sending network data. https://curl.haxx.se/libcurl/c/libcurl-errors.html 

      // This code will retry any ajax requests that fail due to the HTML5 browser CURL error 
      if (typeof (xhr) !== 'undefined' && typeof (textStatus) !== 'undefined' && typeof (error) !== 'undefined') { 
       if (xhr.readyState === 0 && xhr.responseJSON === undefined && xhr.status === 0 && xhr.statusText === 'error') { 
        attemptRetry = true; 
       } 
      } 

      if (self.completedTries < self.maxTries && attemptRetry === true) { 
       //console.log("Waiting " + interval + "ms before retrying..."); 
       setTimeout(function() { 
        tryAjax(d); 
       }, self.interval); 
      } else { 
       d.reject(xhr, textStatus, error); 
      } 

     }); 
    return d; 
} 

}

関連する問題