所以,我有一个从SQL数据库中获取数据的脚本,我试图为它构建一个JS包装器。我使用以下功能调用该脚本,并在准备就绪后立即使用数据库中的信息。
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]);
});
};.
一切似乎都运行正常,但是如果我在创建它之后尝试访问对象的值,它会返回undefined,如下所示:
var me = new User();
//And then, way after the async call and when me.email should be defined
me.email //Returns undefined
为什么我可以在回调中使用它,但之后不能使用它?
答案 0 :(得分:2)
在函数中,除非调用者另外指定,否则上下文变量this
指向全局window
对象或严格模式下的undefined
。因此,您需要在局部变量中捕获this
的值:
//Async call to get user values
var that = this;
this.current(function(response) {
that.email = response.email;
});
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]);
});
};.
此外,正如其他人所提到的,在User
构造函数返回时,无法保证AJAX请求已完成。
答案 1 :(得分:1)
这是一个计时错误,因为在异步调用返回之前不会分配变量。您无法立即访问电子邮件。