在AJAX请求之外设置变量

Set variable outside AJAX request

本文关键字:设置 变量 外设 AJAX 请求      更新时间:2023-09-26

我试图创建一个ajax函数,该函数从页面返回一个特定字符串,然后将其设置在我创建的类中。但是,当我尝试在ajax成功参数中调用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的值,用它来做事。有什么建议吗?

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

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

(您第一次调用setGlideUser实际上会创建这样一个属性,但两者都有不是很混乱吗?)

此外,正如其他人提到的,您试图在ajax操作完成之前 setGlideUser 。您需要从success回调中做到这一点:
main.prototype.load = function()
{
    var that = this;
    $.ajax(
    {
        url: '/home',
        dataType: 'text',
        success: function(data)
        {
            that.setGlideUser(unescape(data).match(pattern));
        }
    });
    return 1; // what's the point?
}

我不太熟悉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;
});

编辑:看注释

在请求返回之前不调用

success异步。当数据值可用时,您需要在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;
}

关键字this表示当前作用域,在这种情况下(双关语)是ajax对象。通过将me赋值给外部对象中的this,需要对外部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;
}

尝试调用这个。setGlideUser在ajax成功参数

那是正确的。但是,成功方法中的this关键字指向jqXHR对象,而不是main实例;您需要取消对它的引用:

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