JavaScript:等待第三方组件可用

JavaScript:等待第三方组件可用,javascript,asynchronous,timeout,Javascript,Asynchronous,Timeout,我在后台的代码中使用了大量的第三方JavaScript库。我对1个特性的问题是,它可能需要一段时间才能可用,用户可以在此之前使用该特性 第二个问题是如何利用需要客户端安装的功能,而客户端安装可能不可用。在第一种情况下,启动action async没有问题,但需要有一个超时时间,在此时间之后,如果客户端安装丢失,并且该功能永远不可用,则该操作将失败(有一个功能可以检查该功能是否已启用) (我也不熟悉新的ES功能,如promise和async await) 我怎样才能做到这一点 编辑: 客户端安装:

我在后台的代码中使用了大量的第三方JavaScript库。我对1个特性的问题是,它可能需要一段时间才能可用,用户可以在此之前使用该特性

第二个问题是如何利用需要客户端安装的功能,而客户端安装可能不可用。在第一种情况下,启动action async没有问题,但需要有一个超时时间,在此时间之后,如果客户端安装丢失,并且该功能永远不可用,则该操作将失败(有一个功能可以检查该功能是否已启用)

(我也不熟悉新的ES功能,如promise和async await)

我怎样才能做到这一点

编辑:

客户端安装:这项功能需要从组件中复制二进制数据。(它还需要一个chrome扩展)

编辑2:

//on button click
if (container === undefined || !container.canPerfromAction()) {
    //wait till condition is wrong up to timeout value (2 seconds for example). This is what doesn't work. Simple sleep would be needed but doesn't seem to exist in JS
}

//check again and fail if not available works fine
container.performAction(); //involves ajax call
然后再次检查,如果条件仍然失败(超时命中),用户将看到一个包含相应信息的错误对话框。除等待部分外,此操作有效

编辑3:

答案/解决方案

由于问题被spergs阻止,我的问题的答案就在这里(为什么spergs从来没有提供过有用的答案?)

解决方案来自

//轮询函数
函数轮询(fn、超时、间隔){
var endTime=Number(new Date())+(超时| | 2000);
间隔=间隔| | 100;
var checkCondition=函数(解析、拒绝){
//如果条件满足,我们就完蛋了!
var result=fn();
如果(结果){
决心(结果);
}
//如果不满足条件但超时时间尚未过去,请再次执行
else if(编号(新日期())
大卫·沃尔什写了一篇文章。这可能不是您的确切解决方案,但伪逻辑可以作为您遵循的指南。我希望你能把你的问题说得更具体一些

//禁用“从每个用户交互元素开始”
const allRequirementsAreMet=函数(){
//在这里检查您的所有要求
返回true | | false;
};
//基本支票
if(document.readyState==='complete'&&allRequirementsAreMet()){
//很好!
enableUserInteraction();
}
//为了我的实习测试而投票
var interval=setInterval(函数(){
if(document.readyState==='complete'&&allRequirementsAreMet()){
间隔时间;
enableUserInteraction();
}    
}, 100);
您应该熟悉动态加载。谷歌将提供帮助 搜索术语,如“动态加载”、“延迟加载”、“异步” 在javascript中加载


你能详细解释一下你说的是什么样的图书馆吗?我不明白为什么有必要执行任何“客户端安装”,这到底应该如何工作,这意味着什么?
用户可以在此之前使用该功能
——如果您编写的代码正确,他们就不能让您熟悉异步加载等。谷歌先生将通过搜索以下术语来帮助您javascript中的“延迟加载”、“异步加载”、“动态加载”。为了理解这里的承诺,让PromiseToothWork=new Promise(函数(resolve,reject){//在这里调用您的第三方函数if(isOK){//resolve(“OK!”);}否则{reject(“发生错误”);}然后(函数(消息){console.log(“结果:“+message”);}).catch(函数(消息){console.log(“不幸:“+message”);})“你必须提供一些代码来让我们理解你的EAL问题。”JaromandaX不是我所要问的问题,而不是聪明的评论,一个解决方案实际上会有帮助。这不是答案:考虑把你的建议变成一个评论。问题是异步加载,因为用户在加载之前已经可以做动作了。@初学者_用户可以在您允许的情况下执行操作。禁用交互,然后在您的应用程序准备就绪时启用。您可以在让用户与您的应用程序交互之前检查所有要求。upvote,因为该站点在另一篇文章中包含了答案。在我的情况下,应启用用户交互,但此功能通常不会启用即使被使用,也不需要在几秒钟内阻塞整个页面。
// The polling function
function poll(fn, timeout, interval) {
    var endTime = Number(new Date()) + (timeout || 2000);
    interval = interval || 100;

    var checkCondition = function(resolve, reject) {
        // If the condition is met, we're done! 
        var result = fn();
        if(result) {
            resolve(result);
        }
        // If the condition isn't met but the timeout hasn't elapsed, go again
        else if (Number(new Date()) < endTime) {
            setTimeout(checkCondition, interval, resolve, reject);
        }
        // Didn't match and too much time, reject!
        else {
            reject(new Error('timed out for ' + fn + ': ' + arguments));
        }
    };

    return new Promise(checkCondition);
}

// Usage:  ensure component is available
poll(function() {
    return container != undefined && container.canPerfromAction());
}, 2000, 150).then(function() {
    container.performAction();
}).catch(function() {
    // Polling timed out
    $( "#error" ).dialog( "open" );
});