在AJAX请求之外设置变量

时间:2012-12-23 21:12:15

标签: javascript jquery

我正在尝试创建一个从页面返回特定字符串的ajax函数,然后在我创建的类中设置它。但是,当我尝试在ajax success参数中调用this.setGlideUser时,它会告诉我

object has no function setUserGlide.

当我尝试在成功参数之外调用this.setUserGlide,然后查看_glideUser的值时,_glideUser未定义。这是我的代码片段。

function main()
{
    this.start = true;
}

main.prototype.load = function()
{
    var _glideUser;
    $.ajax(
    {
        url: '/home',
        dataType: 'text',
        success: function(data)
        {
            // Truncated
            _glideUser = unescape(data).match(pattern);
        }
    });
    this.setGlideUser(_glideUser);
    return 1;
}

main.prototype.setGlideUser(user)
{
    return this._glideUser = user;
}

main.prototype.getGlideUser()
{
    return this._glideUser;
}

var _main = new main();
_main.load();
// check that the ajax has completely loaded
_main.getGlideUser(); // returns undefined

我想不出一种在Ajax成功函数中设置主类中的_glideUser变量的方法。我想在另一个函数中得到_glideUser的值,用它来做事。有什么建议?

5 个答案:

答案 0 :(得分:3)

没有this._glideUser,因为_glideUserload功能的本地。而不是在var _glideUser内声明load,而是将其设置为构造函数中的公共属性:

function main()
{
    this.start = true;
    this._glideUser = null;
}

(您对[{1}}的第一次调用实际上会创建一个这样的属性,但这两者兼容并不令人困惑吗?)

另外,正如其他人提到的那样,您在完成ajax操作之前尝试setGlideUser 。您需要从setGlideUser回调中执行此操作:

success

答案 1 :(得分:1)

我对jQuery不是很熟悉,但是ajax请求可能是异步的,所以你必须从ajax成功调用中调用setGlideUser,只需在你的实例中添加一个引用变量并从那里调用它:

var self = this;
$.ajax(
{
    url: '/home',
    dataType: 'text',
    success: function(data)
    {
        self.setGlideUser(unescape(data).match(pattern));
    }
});

只是一个快速的提示,你可以像这样在js中拥有getter和setter:

main.prototype.__defineSetter__("glideUser", function(value)
{
    this._glideUser = value;
});

main.prototype.__defineGetter__("glideUser", function()
{
    return this._glideUser;
});

编辑: 实际上,请参阅有关该内容的评论

答案 2 :(得分:0)

在请求返回之前,不会调用

success。它是异步。当数据值可用时,您需要在成功本身内调用该方法。

main.prototype.load = function()
{
    var _glideUser, that = this;
    $.ajax(
    {
        url: '/home',
        dataType: 'text',
        success: function(data)
        {
            // Truncated
            var = _glideUser = unescape(data).match(pattern);
            that.setGlideUser(_glideUser);
        }
    });
    // this.setGlideUser(_glideUser); this is incorrect
    return 1;
}

答案 3 :(得分:0)

关键字 this 表示当前范围,在此(双关语)情况下是ajax对象。您需要通过在外部对象中将 me 分配给 this 来引用此对象的外部。

main.prototype.load = function()
 {
    var _glideUser;
    var me = this;
    $.ajax(
    {
        url: '/home',
        dataType: 'text',
        success: function(data)
        {
            // Truncated
            _glideUser = unescape(data).match(pattern);
            me.setGlideUser(_glideUser);
        }
    });
    return 1;
}

答案 4 :(得分:0)

  

尝试在ajax成功参数

中调用this.setGlideUser

这是对的。但是,success方法中的this keyword指向jqXHR对象而不指向main实例;你需要取消引用它:

var that = this;
$.ajax({
    url: '/home',
    dataType: 'text',
    success: function(data) {
        _glideUser = unescape(data).match(pattern);
        that.setGlideUser(_glideUser);
    }
});