2014-12-17 2 views
0

SQL 데이터베이스에서 데이터를 가져 와서 JS 래퍼를 작성하려고합니다. 다음 함수를 사용하여 스크립트를 호출하고 준비가 완료되면 DB에서 정보를 사용합니다.할당 후 Ajax 지정 변수에 액세스 할 수 없습니다.

var User = function() { 
    this.email = null; 

    //Async call to get user values 
    this.current(function(response) { 
     this.email = response.email; 

     //The value is assigned/usable at this point 
    }); 
}; 

User.prototype.current = function(callback) { 
    $.post("php/db_functions.php", {object: "CurrentUser"}).done(function(result) { 
     callback(JSON.parse(result)[0]); 
    }); 
};. 

모든 것이 잘 작동하는 것 같다,하지만 난 그것을 만든 후 객체에서 값에 액세스하려고하면, 그것과 같이, 정의되지 않은 반환

var me = new User(); 

//And then, way after the async call and when me.email should be defined 
me.email //Returns undefined 

왜 내가 그것을 사용할 수 있습니다 콜백에서,하지만 이후에?

+2

'$ .post()'가 ** 비동기 **이기 때문에. – Pointy

+0

비동기라는 것은 자체적으로 도움이되지 않습니다. 내 문제는 상황이 아니라 타이밍 때문이었습니다. – colonelsanders

+0

좋습니다. 사과드립니다. 이것은 매우 일반적인 오해이며 '새로운 User()'호출이 어디에서 발생했는지 분명하지 않았습니다. – Pointy

답변

2

함수에서 컨텍스트 변수 this은 호출자가 별도로 지정하지 않는 한 전역 모드 window 또는 undefined을 엄격 모드로 가리 킵니다. 따라서, 로컬 변수 this 값을 캡처하거나 필요

//Async call to get user values 
var that = this; 
this.current(function(response) { 
    that.email = response.email; 
}); 

또는 사용하여 원하는 문장에 함수를 호출 어느 call 또는 apply 방법

User.prototype.current = function(callback) { 
    var that = this; 
    $.post("php/db_functions.php", {object: "CurrentUser"}).done(function(result) { 
     callback.call(that, JSON.parse(result)[0]); 
    }); 
};. 

또한뿐만 다른 사람들은 AJAX 요청이 User 생성자가 반환 할 때까지 완료 될 것이라고 보장하지 않습니다.

+1

이 작동합니다. 다른 답변자에 대한 메모 : 명확하지는 않았지만 타이밍 문제는 아니 었습니다. 할당 직후 값에 액세스하려하지 않았습니다. 진짜 문제는 바로 여기에 있습니다. – colonelsanders

+0

'this'의 동작은 종종 큰 고통이 될 수 있습니다. ECMAScript 6에서는 람다 (lambda) 표현식 문법이 추가되어'this'를 포착 했으므로 필자가 설명한 것은 더 이상 필요하지 않습니다 :'this.current ((response) => this.email = response.email);'슬프게도, 오직 Firefox 이 주석의 시점에 이들을 지원합니다. – Witiko

+0

함수의 'this'가 기본적으로 전역 객체를 가리킨다는 것은 잘못된 것입니다. 그것은 전적으로 함수가 어떻게 호출되는지에 달려 있습니다. –

1

이것은 비동기 호출이 반환 될 때까지 변수가 할당되지 않았으므로 타이밍 버그입니다. 이메일에 즉시 액세스 할 수 없습니다.

관련 문제