等待方法的响应,然后再继续而不使用 SJAX
Wait for method's response before continuing without using SJAX
我有一个应该返回特定值的方法,并且可以在一次页面加载中多次调用。需要返回的值只能通过 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()
(基于用户活动),我不想到处写回调。
如果您需要更多信息,请告诉我!
将
请求存储在某个地方,以便在尚未完成时返回挂起的请求,这样只会发出一个请求,并且结果被缓存以供以后调用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);
将
"承诺"存储在stored_val中 - 然后.get将始终返回相同的东西,即"承诺",并且您像使用任何其他承诺一样使用它...与.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 现在是一个函数
相关文章:
- 等待函数执行后再继续
- 如何让foreach循环等待$http.get完成后再继续
- 如何在Node.js中等待函数完成后再继续
- 等待AJAX响应后再继续
- 等待 AJAX,然后再继续执行单独的函数
- 使用生成器等待输入,然后再继续 forEach 循环的主体
- 如何使用 JQuery 添加延迟?(让它等待 5 秒再继续)
- 等待多个 ipc 调用完成,然后再继续电子/冗余
- 如何等待findOneAndUpdate完成,然后再继续async.series
- 等待 API 调用在 Javascript 中完成,然后再继续
- Angular2 可观察 - 等待多个函数调用,然后再继续
- 等待方法的响应,然后再继续而不使用 SJAX
- 等待 .each 完成,然后再继续 (jQuery)
- 如何为性能执行多个异步函数(非嵌套),但等待它们完成再继续
- 在JavaScript或Jquery中,让循环等待按钮按下后再继续
- Javascript/jQuery使函数等待回调后再继续
- 等待图像加载后再继续
- 如果我屈服于承诺,它会等待承诺得到解决后再继续吗
- 等待一个函数完成后,再继续使用Javascript或jQuery
- 等待javascript脚本完成后再继续使用Web浏览器?[字幕图像+图片框]