Javascript:同步等待/延迟方法

时间:2015-10-29 22:46:30

标签: javascript ajax delay wait synchronous

我有一个方法执行异步ajax请求,以便从服务器(SharePoint)获取一些权限信息,以便通过JS缓存,以便我可以访问CSR。有时需要更长的时间(500毫秒)...并非总是如此,但有时脚本的其余部分加载得如此之快,以至于在完全完成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延迟几秒,直到请求结束。

2 个答案:

答案 0 :(得分:0)

$-_spYield(a,b)声明为:

init.js

}

答案 1 :(得分:-1)

我将跳过关于这是非常糟糕的练习并始终使用超时和回调的部分。

因为js是单线程的,所以没有很多选项。我会使用一个空循环,但正如@joews所说,这将停止执行,并且cacheLoaded将永远不会设置为true;

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();});