2013-11-23 4 views
0

JSON이 포함 된 텍스트 파일에서 일부 데이터를 읽는 JavaScript 함수가 있습니다. 모든 JSON 데이터를 내 캡슐화 된 함수 내의 전용 변수에 전달하여 데이터를 다시 읽어야 할 경우 변수를 사용할 수있게하려는 것이 이상적입니다.캡슐화 된 JavaScript 함수에서 재사용을위한 개인 변수 설정

나는 특정 검사를해야 할 때마다 텍스트 파일을 읽고 싶지 않습니다. 나에게 이것은 성능면에서 좋지 않다. 당신이 볼 수 있듯이

function someObj() { 
    var siteDataSet = null; 

    this.Init = function() { 
     populateData(); 
    } 

    this.GetPageData = function() { 
     var props = new Array(); 

     props[0] = siteDataSet.pagetitle; 
     props[1] = siteDataSet.week_no; 
     props[2] = siteDataSet.intro_text; 

     return props; 
    } 

    function populateData() { 
     $.ajax({ 
      type: "GET", 
      url: "data.txt", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: "", 
      success: function (result) { 
       siteDataSet = result; 
      }, 
      error: function() { }, 
      complete: function() { } 
     }); 
    } 
} 

$(document).ready(function() { 
    o_obj = new someObj(); 
    o_obj.Init(); 

    var t = o_obj.GetPageData(); 
}); 

, 나는 siteDataSet라는 변수에 모든 JSON을 통과 jQuery를 Ajax를 사용하는 Init() 전화 해요 :

여기 내 코드입니다. GetPageData()을 호출하면 siteDataSet 변수가 null이 아니므로 null입니다.

내가 완전히 어리석은 방식으로 달성하고자하는 것에 접근하고 있습니까?

답변

1

아마도 변수에 액세스하려고하면 Ajax 호출이 비동기 적으로 발생하고 아직 완료되지 않았기 때문일 수 있습니다. 일반적으로 그런 상황에서 가장 좋은 방법은 promise을 사용하는 것입니다.이 코드는 아직 설정되지 않았기 때문에 결과를 예상하도록 코드에 지시합니다.

등의 구현을 제공하는 여러 라이브러리가 있습니다 대안으로 https://github.com/promises-aplus/promises-spec

가있을 것이다 당신은 완료시 호출 할 방법을 만들 수는 다음 실행하고 싶은 모든 코드 통과 그것처럼 뭔가 :. 데이터를 검색 한 후 Init 방법으로 기능을 전달

function afterRetrieved(o_obj) { 
    var t = o_obj.GetPageData(); 
    ... 
} 

o_obj.Init(afterRetrieved); 

실행해야합니다. 다음과 같이 구현을 약간 변경해야합니다.

this.Init = function (fn) { 
    populateData(fn); 
} 

function populateData(fn) { 
    .... 
    success: function (result) { 
    siteDataSet = result; 
    fn(this) 
    }, 
    ... 
} 

그 중 하나가 문제를 해결해야한다고 생각합니다.

+0

비동기식 아약스 호출이 문제가되는 것은 옳습니다. 나는 당신에게 솔루션을 성공적으로 구현할 수있게 해줬지만, 나는 또한 나의 ajax 호출에서 "async : false"속성을 설정하여 내 이슈를 해결하는 것으로 보였다. 솔루션에 비해 "async : false"나쁜 습관을 사용하고 있습니까? – sbhomra

+1

AJAX의 A는 비동기를 의미합니다. 가장 큰 문제는 성능입니다. 완료 될 때까지 차단하여 원격 서버가 처리를 완료 할 때까지 스크립트가 중단됩니다. 대개 지연은 큰 문제는 아니지만 많은 양의 처리, 느린 연결, 높은로드 또는 기타 요인으로 인해 요청이 예상보다 오래 걸릴 수 있습니다. 콜백 메소드를 사용하면 요청이 처리되는 동안 사용자가 사이트를 계속 사용할 수 있습니다. 결국 사용자에게 가장 좋은 경험이 무엇인지에 대한 결정을 내려야합니다. – jcern