2017-05-10 1 views
5

나는 다음과 같은 스레드에서 보았다 나는 확실한 대답을 찾을 수 없습니다 내가 심각한 문제 찾기 위해 노력을 겪고 그러나아약스 파일 업로드 상태 코드를 반환 0 준비 상태 0 (만 가끔)

jQuery Ajax - Status Code 0?

내 문제의 근원 그래서 누군가가 올바른 방향으로 나를 가리킬 수 있기를 희망합니다. 내 코드에서

나는 그때가 같은 서버에 파일을 업로드 AJAX를 사용하고있는 성공 콜백 내에서, 단지 기본 JSON 데이터를 보내는 각도 HTTP 포스트를 수행하고있다.

그것은이

var deferred = $q.defer() 

// first post 
$http.post(url,payload,{params: params, headers: headers) 
    .then(function(response) { 

    uploadFiles(response,deferred); 
    // I am also sending google analytics events here 

    }, function(error) { 
     // do error stuff 
    } 

    return deferred.promise; 

// upload files function 
function uploadFiles(response,deferred){ 

$ajax({ 
    type: 'POST', 
    processData: false, 
    contentType: false, 
    data: data // this new FormData() with files appended to it, 
    url: 'the-endpoint-for-the-upload', 
    dataType: 'json', 
    success: function(data) { 
    // do success stuff here 
    deferred.resolve(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 

      var message = {}; 

      if (jqXHR.status === 0) { 
       message.jqXHRStatusIsZero = "true"; 
      } 

      if (jqXHR.readyState === 0) { 
       message.jqXHRReadyStateIsZero = "true"; 
      } 

      if (jqXHR.status === '') { 
       message.jqXHRStatusIsEmptyString = "true"; 
      } 

      if (jqXHR.status) { 
       message.jqXHRStatus = jqXHR.status; 
      } 

      if (jqXHR.readyState) { 
       message.jqXHRReadyState = jqXHR.readyState; 
      } 

      if (jqXHR.responseText) { 
       message.jqXHR = jqXHR.responseText; 
      } 

      if (textStatus) { 
       message.textStatus = textStatus; 
      } 

      if (errorThrown) { 
       message.errorThrown = errorThrown; 
      } 

      message.error = 'HTTP file upload failed'; 

      logError(message); 

      deferred.resolve(message); 
     } 
    } 
}) 

} 

하지 내 정확한 코드를하지만 거의 동일한 같은 형태 (나는 그러나 나는 순간이 변경할 수 없습니다 jQuery를하고 각도를 사용하지 않아야 알고있다).

문제는 그 실패마다 몇 백에서 거의 작품 모든 시간,하지만 어쩌면 서너입니다. 오류 처리기 함수가 파일 업로드 함수에서 호출되고 파일이 업로드되지 않는다는 것을 의미합니다. 이 경우

나는 jqXHRStatus 0 jqXHRReadyState 0을 얻는다.

내가 문제를 복제 할 수 있어요 유일한 방법은 요청이 처리되고있는 브라우저에서 새로 고침을 치는 것입니다

, 그들은이 일을하지 않는 그러나 사용자가 권고 한

(100 % 확인이에가 있지만)

내가 본 것이 아닌 코드에 심각한 결함이 있습니까? 어쩌면 지연된 변수를 전달하는 것이 좋지 않을까요? 아니면 아약스 요청을 취소하는 다른 방법은 내가 고려하고 있지 않습니까? 동시에 Google Analytics 이벤트를 보내면 방해가 될 수 있습니까?

모든 조언을 제공해 주시면 문제에 대한 자세한 정보를 알려 주시기 바랍니다.

+1

페이지 요청시 전환 또는 어쩌면 완전히로드하지 않고 요청이 이미 시작하면되는 경우가 발생할 수 있습니다? 데이터가 o.k가 아닌 경우에 발생할 수 있습니다. 일부 이벤트가 해고 될 수 있습니까? 그게 사실이 아냐? 뭔가 처리가 진행되는 동안 요청이 중단되어야하기 때문입니다. – Blackbam

+0

어떻게 백엔드 오류를 처리합니까? 백엔드 코드도 표시 될 수 있습니다. – alepeino

+0

브라우저를 볼 때 브라우저에서 새로 고침을 눌러 문제를 재현 할 때 자세한 정보를 얻을 수 있습니다. 네트워크 탭에는 추가 정보가있을 수 있습니다 (XHR 옵션) – KorreyD

답변

0

내 생각 엔 실제로 다시 호출에서 취득하기 전에 당신의 코드가 실행된다는 점이다. 나는. 호출이 돌아가고 아무것도 반환되지 않고 0 오류가 발생합니다. 이것은 오류가 가변적이므로 의미가 있습니다. 백엔드 충분히 빠르게 실행하기 때문에 때로는 그것이 특히 오래 걸려서하지 않기 때문에 또는 뭔가 다른 그 어느 정말 실행을 중지하지 않는 등 자바 스크립트 일어난 대부분의 시간 괜찮 반환합니다. 그것은 특히 각도와 jquery 사이에서 여러 개의 ajax 요청으로 통과한다고 말합니다. 실제로 두 번째 ajax 호출을 실행하는 경우 실제로 각도 게시물을 완성하기 전에는 놀라지 않을 것입니다. 그래서 새로 고침은 변수를 지우므로 오류를 복제합니다. 이 테스트 할 수있는

어떤 것들은 : 백엔드에

  1. 이 아무것도 반환하기 전에 몇 초 동안 이동 타이머를합니다. 이렇게하면 코드가 더 일관되게 실패하게됩니다.

  2. 중단 점을 설정하고 히트하고있는 시간과 자바 스크립트에 포함 된 값을 확인하십시오.

행운을 빈다!

2

이는 요청이 취소 된 것을 의미한다.

거기에는 여러 가지 이유가있을 수 있지만 브라우저의 버그 또는 문제로 인한 것일 수 있습니다. 따라서 이러한 종류의 문제를 방지 할 수있는 방법은 없습니다.

예를 들어, 503 (서비스를 사용할 수 없음) 응답이 있다고 가정 해보십시오. 그런 경우에 당신이 무엇을 할 것입니까? 이것은 산발적이고 예측할 수없는 문제이기도합니다. 그냥 살고 데이터를 다시 게시 해보십시오. 바퀴를 개혁하지 않고

, 난 당신이 구현하는 것이 좋습니다 : Retrying ajax calls using the deferred api

관련 문제