如何在ajax成功函数中为实例变量赋值

时间:2014-10-12 09:56:39

标签: javascript ajax

我想从ajax成功函数中为类实例变量赋值,代码会更好地解释我的意思。

var SomeClass = function() {
    this.someMethod = function() {
        $.ajax({
            method: 'GET',
            url: 'http://example.com',
            success: function(resp) {
                var js = JSON.parse(resp);
                // I want to assign js object to SomeClass.response instance variable
            };
        });
    };
};

如果我试试这个。回应,它显然不起作用。如果我在进行ajax调用之前将其分配给某个变量,它也不起作用。我的意思是:

var SomeClass = function() {
    this.someMethod = function() {
        // Asign this to self
        var self = this;
        $.ajax({
            method: 'GET',
            url: 'http://example.com',
            success: function(resp) {
                var js = JSON.parse(resp);
                // I want to assign js object to SomeClass.response instance variable
                self.response = js;  // However it doesn't work
            };
        });
    };
};

我很感激你的帮助!!!

2 个答案:

答案 0 :(得分:1)

由于AJAX是异步的,因此在AJAX调用完成之前,您无法使用someVariable.response。适当的方法是让someMethod进行回调:

var SomeClass = function() {
    this.someMethod = function(callback) {
        // Asign this to self
        var self = this;
        $.ajax({
            method: 'GET',
            url: 'http://example.com',
            success: function(resp) {
                var js = JSON.parse(resp);
                // I want to assign js object to SomeClass.response instance variable
                self.response = js;
                callback();
            };
        });
    };
};

然后你会像这样使用它:

var someVariable = new someClass;
someVariable.someMethod(function() {
    console.log(someVariable.response);
});

答案 1 :(得分:1)

虽然@Barmar解决方案可行,但我认为它只是使用promises的最佳方式..而且由于你已经使用jQuery,这很容易。见下文:

var SomeClass = function() { this.someMethod = function() { return $.ajax({ method: 'GET', url: 'http://example.com' }); }; };

然后你做这样的事情:

var someVariable = new SomeClass();
    someVariable.someMethod().then(function(returnedValue){
        console.log(JSON.parse(returnedValue));
});

我相信承诺是要走的路,因为它们将被纳入ES6 ......更好地熟悉这个概念。