2012-11-08 8 views
1

여기 내 개체가 있고 모든 속성과 함수를 정의했지만 여전히이 오류 result is not defined을 제공합니다. 여기결과 속성이 정의되어 있지 않습니다. 왜?

var Xml = { 
    to  : null, 
    from : null, 
    url  : null, 
    result : null, //<--- I defined result here 

    init: function (fromaddress, toaddress, link) { 
     from = fromaddress; 
     to  = toaddress; 
     url  = link; 

     this.requestXml(); 
     return this; 
    }, 

    requestXml: function() { 
     $.ajax({ 
      type: "GET", 
      url: url, 
      dataType: "xml", 
      success: this.parseXml 
     }); 
    }, 

    parseXml: function (xml) { 
     console.log('xml: ' + $(xml)); 
     result = $(xml); //<--- Assigning value to result here 
    }, 

    getResult: function() { 
     console.log('Result: ' + result); // <--- Here is says result is not defined 
     return result; 
    } 
}; 

가 어떻게이 문제를 해결할 수있는 내 코드?

업데이트

내가

var Route = { 
fromurl : null, 
tourl : null, 
from : null, 
to  : null, 

init: function (fromaddress, toaddress) { 
    from  = fromaddress; 
    to   = toaddress; 
    fromurl  = 'http://demo.com/url'+fromurl; 
    tourl  = 'http://demo.com/url'+tourl; 

    Route.searchRoute(); 
}, 

searchRoute: function() { 
    var xml = Xml.init(from, to, fromurl); 
    console.log(xml.getResult()); //<---- calling getResult(); 
} 

}; 
+2

이것은 AJAX 요청이 비동기 적이기 때문에'obj.requestXml()'다음에'obj.getResult()'를 곧바로 호출한다고 가정합니다. 이 시점에서 AJAX 요청은 완료되지 않았으므로 'result'는 정의되지 않습니다. –

+0

@RoryMcCrossan 그렇다면 아약스 요청이 완료 될 때까지 어떻게 기다려야합니까? – 2619

+0

'parseXml'에서'getResult' _after_를 호출해야합니다. 'parseXml'을 호출 한 직후 결과를 처리하기 위해 콜백을 전달할 수 있도록 코드를 재구성해야합니다. 나중에 객체를 호출하여 나중에 getter를 호출해야합니다. 이와 같은 "게터"를 갖는 것은 비동기 코드가 구조화 된 방법이 아닙니다. –

답변

2

아래 result 당신이없는 result라는 이름의 전역 변수를 참조 할 것 "꾸며지지 않은 '표현을 getResult를()를 호출하고 있습니다.

result에 대한 참조가 참조가 해당 개체의 속성을 참조하는 개체의 텍스트 내부에 있다고 가정하면 올바르지 않습니다. 다른 언어에서는 그럴 수 있지만 JavaScript에서는 그렇지 않을 수 있습니다.

문제의 해결책은 질문에 대한 의견 중 하나입니다. 이 경우 접두어로 this.을 사용하면됩니다. 이 코드를보십시오 :

여기
var x = 1; 

var p = { 
    x: 2, 
    f: function() {alert(x); alert(this.x);} 
} 

p.f(); 

당신이 경고 1 참조하고 다음 업데이트 된 질문

2.

대답 당신이 여기에있는 것은 고전적인 문제입니다. 작성하십시오

var xml = Xml.init(from, to, fromurl); 
console.log(xml.getResult()); //<---- calling getResult(); 

첫 번째 라인은 결국 Ajax 요청을 발생시킵니다. 요청이 해고되면 즉시 두 번째 줄로 이동하여 xml.getResult()으로 전화하십시오. 기회는 거의 100 %이며 getResult 전화가 일 때 전에 result 값을 기입 할 수 있습니다.

한 가지 방법은 을 수행하여을 수행하고 결과를 init 방법으로 전달하는 것입니다. 당신이 결과를 기록, 그래서 우리가 처리해야 다음

var xml = Xml.init(from, to, fromurl, function() {console.log(xml.getResult()}); 

우리가 Xml.init에 새 네 번째 매개 변수를 시도하려는 것처럼이 경우에는 보이는의 Xml 개체를 업데이트하여 같은 (테스트하지) :

. 
. 
. 
init: function (fromaddress, toaddress, link, callback) { 
    from = fromaddress; 
    to  = toaddress; 
    url  = link; 

    this.requestXml(callback); 
    return this; 
}, 

requestXml: function (callback) { 
    $.ajax({ 
     type: "GET", 
     url: url, 
     dataType: "xml", 
     success: callback 
    }); 
}, 

. 
. 
. 

즉, 비동기 호출을 할 때는 결과를 즉시 사용하십시오. 그들이 "준비"될 때를 결코 알지 못하기 때문에 나중에 저장하지 마십시오.

+0

이 문제를 어떻게 해결할 수 있습니까? 모든 데모 코드가 도움이 될 것입니다. 미리 감사드립니다. – 2619

+0

데모 코드가 추가되었습니다. –

+0

여기 x가 결과입니다. 내가 맞습니까? – 2619

1

당신은 this 사용해야합니다,하지만 당신은 모든 방법의 속성에 액세스 할 수 있도록 생성자를 사용하면 쉽게 할 수 있습니다

function Xml(to, from, url, result) { 
    this.to  = to || null; 
    this.from = from || null; 
    this.url  = url || null; 
    this.result = result || null; 
    // init logic 
} 

Xml.prototype = { 

    parseXml: function (xml) { 
    console.log('xml: ' + $(xml)); 
    this.result = $(xml); 
    }, 

    getResult: function() { 
    console.log('Result: ' + this.result); 
    return this.result; 
    } 

    ... 

} 

var xml = new Xml(to, from, url, result); // init 

편집 : 리터럴 객체가 최상의 옵션이 아닐 수 있습니다 .당신이 this 혼동을 피하기 위해 원하는 경우 귀하의 경우는 위와 같이 생성자, 또는 모듈 패턴에 더 적합 :

function Xml() { 

    var xml = {} 
    , to = null 
    , from = null 
    , url = null 
    , result = null; 

    xml.parseXml = function(xml) { 
    ... 
    }; 

    ... 

    return xml; 

} 

var xml = Xml(); 
+0

this.result가 작동하지 않습니다. 벌써 해봤 어. – 2619

+0

리터럴 객체를 사용하고 있기 때문에 예제에서는 작동하지 않습니다. 먼저 xml = {}과 같은 빈 객체를 선언하고'xml.getResult = function() {...} '과 같은 점 표기법을 사용하여 메소드를 추가 한 다음 이미 존재하는 속성을 사용하려면'xml.property' 대신에 '이 .'. – elclanrs

+0

this.result를 사용하더라도'result is notdefined'와 달리'undefined'를 반환합니다. – 2619

0

XML.result

this의 기능과 아웃에 대한 설명은 Understanding "this" in Javascript를 참조 시도 그것은 다른 시점을 가리키고 있습니다.

관련 문제