在类变量中保存ajax请求的结果

时间:2014-01-29 15:35:06

标签: javascript jquery ajax

我想构建一个我初始化的javascript类,并且只会发出一个ajax请求来保存一些数据,所以我可以用它来做事。重要的是,出于性能原因只有一个请求。

这是初始化

var web = new webService();
web.connect(app.info);
web.info();

这是我的班级

function webService() {

    this.d = new Object;

    this.connect = function(app) {
        console.log(app);

        $.ajax({
            url: 'my working url which gives me my jsonp object',
            dataType: 'jsonp',
            jsonp: 'jsoncallback',
            timeout: 5000,
            success: function(data) {
                this.d = data;
            },
            async: false
        });
    }

    this.info = function() {
        console.log(this.d);
    }

}

我想知道同步可能有问题吗?我不确定所以我想问你们。

3 个答案:

答案 0 :(得分:3)

jQuery $.ajax(以及类似的方法,如$.getJSON())将返回Deferred对象。与其他JavaScript对象一样,这是一个“东西”,您可以将其存储在变量中并在代码中传递。然后你可以随时添加(异步)回调:

// Don't include a 'success' callback yet.
$def = $.ajax(...);
// $def is an object which you can store globally 
// or pass as an argument into other functions.
//
// Somewhere else, add a success callback:
$def.done(function(data) {
   // ...
});

请参阅http://api.jquery.com/category/deferred-object/

答案 1 :(得分:1)

如果您重构代码以返回deferred对象:

function webService() {

this.d = new Object;

this.connect = function(app) {
    console.log(app);

    return $.ajax({
        url: 'my working url which gives me my jsonp object',
        dataType: 'jsonp',
        jsonp: 'jsoncallback',
        timeout: 5000,
        success: function(data) {
            this.d = data;
        }
    });
}

this.info = function() {
    console.log(this.d);
}

}

然后您可以使用done

var web = new webService();

web.connect(app.info).done(function() {web.info();});

这也意味着你的 A jax是异步的,就像它应该的那样。

你可以争辩说,如果你沿着这条路走下去,你的功能网络服务甚至在做什么。为什么不让deferred完成所有的工作?

答案 2 :(得分:0)

this.connect = function(app) {
    console.log(app);
    var that = this;  //store this into a variable

    $.ajax({
        url: 'my working url which gives me my jsonp object',
        dataType: 'jsonp',
        jsonp: 'jsoncallback',
        timeout: 5000,
        success: function(data) {
            that.d = data;  //use that so you have the right scope
        },
        async: false
    });
}

其他选项是使用bind或jQuery的代理