我有一个方法,它执行一个异步ajax请求,从服务器(SharePoint)获取一些权限信息,通过JS缓存,这样我就可以为CSR访问它了。有时这需要更长的时间(500ms)……并不总是如此,但有时脚本的其余部分加载得如此之快,以至于在ajax请求完全完成之前需要权限。
有没有一种简单的方法来延迟方法的输出?我用SetTimeout()尝试了不同的方法,但都不起作用。
以下是简化的代码。
var Permissions = {
get: function(key) {
while (this.cacheLoaded != true) {
wait(100); //<-- This is what I need
}
return (typeof this[key] != 'undefined' && this[key] == true) ? true : false;
},
cacheLoaded: false,
buildCache: function () {
// load permissions asynchronously by ajax
.
.
.
Permissions.cacheLoaded = true;
}
}
Permissions.buildCache();
.
.
.
doLotsOfOtherStuff();
.
.
.
//Here is the actual call of the get-function:
if (Permission.get('ALOW_DELETE')) {
deleteSomething();
}当然,我可以将Ajax请求切换为同步。但是这会延迟整个脚本的加载。所以实际上我想把getter延迟几毫秒,直到请求完成。
发布于 2015-11-01 04:38:55
init.js中有一个_spYield(a,b),声明为:
function _spYield(b, a) {
if (a > 0)
window.setTimeout(function() {
_spYield(b, a - 1)
}
, 0);
else
b()}
发布于 2015-10-30 06:52:10
我将跳过关于这是非常糟糕的做法的部分,并始终使用超时和回调。
因为js是单线程的,所以您没有太多的选择。我会使用一个空循环,但正如@joews所说,这将使执行停止,并且cacheLoaded永远不会被设置为真;
while (this.cacheLoaded != true) { /*Stall*/ }编辑:
回调方案:
get: function(key, callback) {
var fn = function {
if(this.cacheLoaded != true)
window.setTimeout(fn, 500);
else
callback((typeof this[key] != 'undefined' && this[key] == true) ? true : false);
};
fn();
}然后这样叫它:
Permission.get('ALOW_DELETE', function(result) {if(result) deleteSomething();});https://stackoverflow.com/questions/33425960
复制相似问题