2009-11-24 3 views
2

YUI 팀에서 제공 한 약간 수정 된 샘플 코드를 사용하고 있습니다. 내 소스가 JSON이 아닌 다른 것으로 응답하거나 JSON 구문 오류가있는 경우 브라우저 (Safari)가 스크립트 처리를 중단하고 사용자에게 알리지 못하게합니다.YUI3을 사용하는 동안 Javascript 구문 오류를 잡습니다.

저는 확실히 JS 전문가입니다. 따라서이 코드는 꼭 필요한 코드보다 더 추악한 코드 일 수 있습니다. 코드는 대략 다음과 같습니다

YUI().use("dump", "node", "datasource-get", "datasource-jsonschema", function(Y) { 
    var myDataSource = new Y.DataSource.Get({ 
    source:"/some/json/source/?"}), 
    myCallback = { 
     success: function(e){ 
     myResponse = e.response; 
     doSomething(myDataSource); 
     }, 
     failure: function(e){ 
     Y.get("#errors").setContent("<li>Could not retrieve data: " + e.error.message + "</li>"); 
     } 
    }; 

    myDataSource.plug(Y.Plugin.DataSourceJSONSchema, { 
    schema: { 
     resultListLocator: "blah.list", 
     resultFields: ["user", "nickname"] 
    } 
    }); 
    myDataSource.sendRequest("foo=bar", myCallback); 
} 

나는 시도/캐치에서 "var에위한 myDataSource"블록을 포장 시도했습니다, 나는 또한 전체 YUI()를 포장하려고했습니다() 블록을 사용합니다..

구문 오류를 포착 할 수 있습니까? 올인원 DataSource.Get 호출을 별도의 IO로 바꾸고 호출을 구문 분석해야합니까?

답변

1

로컬 스크립트를 요구하고 있기 때문에, 당신은 시도 안에 Y.io + Y.JSON.parse을 사용할 수 있습니다/catch 또는 Y.DataSource.IO + Y.DataSchema.JSON (+ Y.JSON).

DataSource.Get의 장점은 동일 출처 정책을 피하는 것입니다. 그러나 덜 안전하고 덜 유연합니다. 필요하지 않은 경우 사용하지 마십시오.

DataSource.Get의 계약은 서버가 JSONP를 지원한다는 것입니다. 이것이 작동하는 방식은 Get = (제공된 url) & 콜백 = someDataSourceFunction을 사용하여 페이지에 스크립트 노드를 추가하는 것입니다.

브라우저가 해당 URL에서 자원과 두 가지 중 하나 일 것입니다 요청합니다 :

  1. 서버가 someDataSourceFunction의 형태로 자바 스크립트 문자열 ({ "모든"로 응답합니다 : "데이터를" }); 또는
  2. 서버는 JavaScript로 구문 분석 할 수없는 일부 텍스트를 반환합니다.

두 경우 모두 해당 문자열은 스크립트 노드의 내용으로 처리됩니다. 구문 분석되고 실행됩니다. 구문 분석 할 수 없으면 브라우저에서 오류가 발생합니다. 이걸 막을 순 없어. JSONP는 실제 JSON (심지어는 유효하지 않은 JSON도 해석 및 실행해야 함)의 스펙 제약 조건을 충족시키지 못하지만 항상 순수 JSON을 사용해야하며 JSON 출력을 생성 할 때는 항상 서버 측 라이브러리를 사용해야합니다 (http://json.org에서 libs 목록보기 상상할 수있는 모든 언어로). JSON을 손으로 롤하지 마십시오. 그것은 단지 몇 시간의 디버깅으로 이어집니다.

0

어쩌면 당신 "해봐요"전에이 시도 :

try 
{ 
    var test = YAHOO.lang.JSON.parse(jsonString); 
    ... 
} 
catch (e) 
{ 
    alert('invalid json'); 
} 
1

문제는 유이도 실패를보고 할 수있는 기회를 얻을 전에 오류가 브라우저 (자바 스크립트 구문 분석)의 일부 수준에서 발생 아마이다.

window.onerror를 구현하지 않는 Safari에서 이러한 종류의 오류를 잡는 것은 아주 어렵습니다. 내 Javascript library, bezen.org 더 많은 오류를 포착하기 위해, 나는 비동기 코드가 트리거 장소에서 시도/캐치를 추가 :

  • (당신의 JSON 다운로드에 해당)
  • 의 setTimeout/setTimer로드 동적 스크립트 : 나는 포장 교체 이 브라우저는 에러를 기록하는 try/catch를 삽입합니다.

해당 모듈의 소스 코드를 살펴 보는 것이 좋습니다. 해당 모듈의 소스 코드를 살펴 보는 것이 좋습니다. 귀하의 문제 :

appendScript 방법에 safelistener에 대한는