2011-04-11 8 views
1

제목에 대해 유감입니다.이 설명 방법을 모르겠습니다.IF 문에서 자바 스크립트 개체 선언

기본적으로 JQUERY/ajax를 사용하여 PHP 스크립트를 호출하여 일부 입력의 유효성을 검사하고 일부 데이터를 가져옵니다. 반환 된 데이터는 JSON으로 인코딩되므로 JQuery에서 JSON으로 데이터 유형을 설정하고 객체를 반환합니다.

네트워크 연결이 예상대로 응답하지 않는 특정 조건 하에서 (예기치 않은) 조건에서 Ajax 호출이 JQUERY의 오류 옵션을 호출한다는 것을 발견했습니다.

대부분의 경우 서버에서 오류 메시지가 표시되지만 오류가 발생하고 서버 측 스크립트에서 JSON이 다시 전송되지 않는 경우가 있습니다. 나는 그 네트워크 상황을 아직 자극시킬 수있는 것을 정확히 추적하지는 못했지만, 어쨌든 나는 아직 알지 못하는 사이에 Javascript로 다시 처리 할 것이라고 생각했다.

아이디어는 예상 개체가 만들어 졌는지 확인하고 그렇지 않은 경우 예상되는 두 속성을 사용하여 만들고 대화 상자를 실행하는 것입니다. 이 방법을 사용하면 오류 메시지를 반복하여 작성하지 않아도됩니다. 큰 절약은 아니지만 원리를 시험해보고 싶었습니다.

$.ajax({ 
     url: 'getmetadata.php', 
     type: "POST", 
     data: entereddata, 
     dataType: "json", 
     timeout: (7000), //wait 7 seconds 

     error: function(data) 
     { 
     // handle errors 
     if(data) 
     { 

     // Do nothing error message will be issued from the data object 
     }else{ 
        // no message was returned. Some other error occured. 
      function tempdata() 
      { 

       this.errortitle = "Error title"; 
       this.errormessage = "Error text"; 
      }; 

      var data = new tempdata(); 
     }; 

     // issue error message 
     runDialogue(data.errortitle,data.errormessage); 

     }, //ERROR 

     success: function(data) 
     { 
     }; // SUCCESS 
}); // AJAX 

위의 코드에서 데이터 개체는 "if"문 앞에 존재해야합니다. 그리고 runDialogue()에 도착하면; errortitle 및 errordescription 특성을 전달하기 위해 오브젝트 데이터가 항상 있어야합니다.

"데이터"개체가있는 경우 아무 문제가 없습니다. 작동하지 않는 것은 "데이터"개체가 존재하지 않는 경우, 즉 "if"테스트에 실패한 경우입니다. else는 "data"객체를 생성해야하지만 그렇지 않습니다.

내가 잘못 했습니까?

답변

3

당신은 이 다른 블록의 변수 데이터 (보다 구체적인 범위) 따라서 전역 변수가 아직 정의되지 않습니다를 재정의합니다. var 데이터 변경 = 새 tempdata();

그래서
data = new tempdata(); //In the else block 

에, 지금 아약스 호출은 다음과 같은 모양입니다 :

자바 스크립트가 정의되지 않은 참조에 오류가 발생합니다
$.ajax({ 
      url: 'getmetadata.php', 
      type: "POST", 
      data: entereddata, 
      dataType: "json", 
      timeout: (7000), //wait 7 seconds 

      error: function(data) 
      { 
      // handle errors 
      if(data) 
      { 

      // Do nothing error message will be issued from the data object 
      }else{ 


       /******************NOTE THE CHANGE HERE********************/ 
       data = { 

        errortitle:"Error title", 
        errormessage:"Error text" 
       }; 

      }; 

      // issue error message 
      runDialogue(data.errortitle,data.errormessage); 

      }, //ERROR 

      success: function(data) 
      { 
      }; // SUCCESS 
    }); // AJAX 
+1

또한 "else"절에서 그 함수를 정의하는 것은 꽤 비관적입니다. – Pointy

+0

함수를 정의하지 않습니다. 객체이고, 이미 종료하지 않은 경우에만 정의해야합니다. – T9b

+0

@Pointy : :) 함수 호출을 객체 할당으로 변경했습니다. – Chandu

0

; 당신은 단지 객체를 사용하여 존재를 테스트 할 수 없습니다. typeof 연산자를 사용하여 데이터가 존재하는지 여부를 테스트하거나 "object"유형인지 여부를 테스트 할 수 있습니다. 예를 들어

: $ 아약스가 (때문에 HTTP 오류의) 실패의에는 .error 메서드가 호출 다음과 같은 PARAMS 전달

if (typeof data === "undefined") 
{ 
    // You don't really need a closure for this... 
    errordata = {'errortitle' : 'Error Title', 
       'errormessage' : 'Error Message'}; 

runDialogue(data.errortitle, data.errormessage); 
} 
0

: 오류 (jqXHR, textStatus, errorThrown를)

"data"라고 불리는 첫 번째 매개 변수는 "웹 서버가 보낸 것"이 아니라 jquery wrapped xmlhttprequest 객체입니다. "if"(예 : if (data)]를 통해 항상 true를 반환합니다.

+0

내가 발견 한 "데이터 유형"옵션을 사용할 때 항상 그런 것은 아닙니다. Cybernate의 대답은 작동합니다. 즉, (데이터)가 false를 반환 할 수있는 경우를 의미합니다. 예를 들어 timeout = 1로 설정하면. – T9b

+0

정말? 나는 timeout = 1로 시도해 보았고 항상 if의 "true"블록을 쳤다. 어깨를 으해라. – James

+0

제가 말했듯이 꽤 이상한 문제입니다. 나는 개발 서버 측에도 타임 아웃을 가지고 있으며 비슷한 결과 ("결과"는 실제 문제와 동일하다는 것을 의미하지는 않는다)를 시뮬레이트하기 위해 찾은 유일한 방법은 jquery timeout을 1로 줄이는 것이었다. 리콜 문제는 약 30 분 동안 한 번만 발생했으며, ISP가 응답하지 않았다는 결론을 내릴 수있었습니다. 경로에있는 다른 모든 것들 (devmachine> router> modem> internet)은 녹색 불이 들어 왔지만 ISP는 네트워크 검사에서 빨간색이었습니다. 내 ISP가 고장난 것 같아서 사용자를 위해이 오류를 처리해야한다고 생각했습니다. – T9b