簡體   English   中英

在AJAX請求之外設置變量

[英]Set variable outside AJAX request

我正在嘗試創建一個從頁面返回特定字符串的ajax函數,然后在我創建的類中設置它。 但是,當我嘗試在ajax success參數中調用this.setGlideUser ,它會告訴我

object has no function setUserGlide.

當我嘗試在success參數之外調用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 它是異步的 當數據值可用時,您需要在成功本身內調用該方法。

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;
}

關鍵字意味着當前范圍,在這個(雙關語)情況下是ajax對象。 您需要將外部此對象的引用,通過在外部對象分配這一點

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;
}

嘗試在ajax success參數中調用this.setGlideUser

那是對的。 但是,success方法中的this關鍵字指向jqXHR對象而不是main實例; 你需要取消引用它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM