我有一个应该返回特定值的方法,并且可以在一个页面加载中多次调用。需要返回的值只能通过 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 的 promise ,它允许推迟方法直到操作完成,也许可以在这里使用?我已经研究过但找不到任何方法来做到这一点。如果它允许我做类似的事情:
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()
> 随时(基于用户事件),我不想到处编写回调。
如果您需要更多信息,请告诉我!
最佳答案
将请求存储在某处,这样如果尚未完成,您可以返回待处理的请求,这样仅发出一个请求,并且结果会被缓存以供以后调用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;
}
};
那么你可以这样做
dynamo.get().done(fn).fail(err);
关于javascript - 在不使用 AJAX 的情况下继续之前等待方法响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35525388/