我想构建一个我初始化的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);
}
}
我想知道同步可能有问题吗?我不确定所以我想问你们。
答案 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) {
// ...
});
答案 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的代理