我有一个应该返回特定值的方法,并且可以在一个页面加载中多次调用。需要返回的值只能通过S / AJAX访问,因此在第一次找到之后,它会存储在一个值中以供将来检索。
var dynamo = {
stored_val : 0,
get : function() {
if(stored_val === 0) {
$.ajax({
url : 'URL'
success : function(r) {
dynamo.stored_val = r;
// I want to return this value here now!
}
});
} else {
return dynamo.stored_val;
}
}
};
正如您所看到的,我想使用dynamo.get
并在继续使用其余代码之前让它的返回值易于访问。我知道SJAX,但由于它已被弃用,我宁愿不使用它。我查看了jQuery的承诺,允许方法延迟到动作完成,也许可以在这里使用?我已经调查了它,但无法找到任何办法。如果它允许我做类似的事情:
dynamo.get().done(function(r) {
// everything else here
// r = the value of dynamo.stored_val after .get() and all AJAX calls within have completed
});
这可能吗?
我知道我可以简单地从.get()
中提取方法并将其与回调一起使用,但我的代码中有多个点可以随时调用.get()
(基于用户活动)和我不想在任何地方写回调。
如果您需要更多信息,请与我们联系!
答案 0 :(得分:0)
将请求存储在某处,这样您就可以在尚未完成的情况下返回待处理的请求,这样就可以仅一个请求,并且结果会被缓存以便以后调用{{1} }
get()
然后你可以做
var dynamo = {
xhr : null,
stored_val : 0,
get : function() {
if( this.stored_val === 0 && this.xhr === null) {
this.xhr = $.ajax({ url : 'URL', context : this }).always(function(res) {
this.xhr = null;
this.stored_val = res;
})
} else if (this.xhr === null) {
this.xhr = (new $.Deferred()).resolve(this.stored_val);
}
return this.xhr;
}
};
答案 1 :(得分:0)
存储"承诺"在stored_val中 - 然后.get将始终返回相同的内容," Promise",并且像任何其他Promise一样使用它... .then
(不确定.done
是什么在jquery中,即对底层Promise有任何副作用吗?如果没有,那么使用.done而不是.then
var dynamo = {
stored_val : 0,
get : function() {
if(dynamo.stored_val === 0) {
dynamo.stored_val = $.ajax({
url : 'URL'
});
}
return dynamo.stored_val;
}
};
dynamo.get().then(function(result) {
// do something with result
});
就个人而言,我发现这样的对象有点麻烦,特别是当它们对它们有更多的时候 - 我更喜欢使用IIFE来代替这些代码
var dynamo = (function() {
var stored_val;
return {
get : function() {
return stored_val = (stored_val === undefined) ? $.ajax({ url : 'URL' }) : stored_val;
}
};
}());
甚至更清洁
var dynamo = (function() {
var stored_val;
return function() {
return stored_val = (stored_val === undefined) ? $.ajax({ url : 'URL' }) : stored_val;
};
}());
但是,在最后一种情况下,用法是
dynamo().then(...);
不需要get(),dynamo现在是一个函数