分配后,Ajax分配的变量不可访问

时间:2014-12-17 23:29:40

标签: javascript jquery ajax

所以,我有一个从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

为什么我可以在回调中使用它,但之后不能使用它?

2 个答案:

答案 0 :(得分:2)

在函数中,除非调用者另外指定,否则上下文变量this指向全局window对象或严格模式下的undefined。因此,您需要在局部变量中捕获this的值:

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

或使用callapply方法在所需的上下文中调用该函数:

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)

这是一个计时错误,因为在异步调用返回之前不会分配变量。您无法立即访问电子邮件。