当前位置: 首页 > 面试题库 >

对RequireJS可用资源的投票

龙承德
2023-03-14
问题内容

因此,我使用RequireJS和Socket.io编写了一个应用程序,该应用程序检查socket.io资源是否可用,然后在连接时引导该应用程序。万一socket.io暂时关闭,我想对资源进行几次requireJS轮询,直到可用为止,然后继续初始化应用程序。

不幸的是(或者幸运的是?)似乎有某种缓存机制要求require为未加载的脚本注册脚本错误,因此,如果您在错误回调中执行setTimeout重试socketio
require函数,则require将继续即使资源可用也会引发错误。

这是疏忽还是有理由保留此错误?更重要的是,是否有一种解决方法可以允许要求重试?

这是我一直在尝试的示例:

function initialize() {
  require(['socketio', function(io) {
    io.connect('http://localhost');
    app._bootstrap();
  }, function(err) {
    console.log(err);
    setTimeout(initialize, 10000);
  });
}

问题答案:

我知道这是一个古老的问题,但这让我很感兴趣,所以我调查了一下…

您需要调用一个require.undef方法,以告知RequireJS不要缓存加载的先前失败状态。另请参见errbacks示例。

然后,您可以再次使用null回调再次调用require。原始回调仍将被调用-无需递归。像这样:

function requireWithRetry(libname, cb, retryInterval, retryLimit) {
    // defaults
    retryInterval = retryInterval || 10000;
    retryLimit = retryLimit || 10;

    var retryCount = 0;
    var retryOnError = function(err) {
        var failedId = err.requireModules && err.requireModules[0];
        if (retryCount < retryLimit && failedId === libname) {
            // this is what tells RequireJS not to cache the previous failure status
            require.undef(failedId);

            retryCount++;
            console.log('retry ' + retryCount + ' of ' + retryLimit)

            setTimeout(function(){
                // No actual callback here. The original callback will get invoked.
                require([libname], null, retryOnError);
            }, retryInterval);

        } else {
            console.log('gave up', err)
        }
    }

    // initial require of the lib, using the supplied callback plus our custom
    // error callback defined above
    require([libname], cb, retryOnError);
}

requireWithRetry('socketio', function(io) {
    io.connect('http://localhost');
    app._bootstrap();
});


 类似资料:
  • 我正在尝试编写我的第一个JSF应用程序,但在Apache Tomcat 8.0/GlassFish 4服务器上部署它时遇到了问题。 例如,我使用了Horstmann的Core Java Server Faces中描述的应用程序(它来自这里的源代码ch01)。根据这本书,我应该做(对于Win 7 x64): < li >从路径ch01/login/src/java使用以下命令行命令编译项目: 如果使

  • 我有一个简单的,它使用公开。下面是实体类: 我创建了一个类,它的外观如下: 下面是repository类: 我还在配置中指定了用户投影,以确保它将被使用。 因此,当我进入/users路径时,我得到以下响应(应用了投影):

  • res\drawable\mylayerlistdrawable.xml ----------------------------------------------------------------------------------- 最终答案 在api 21之前的xml可提取资源中,我们不能使用?attr。由aapt在编译时创建的可提取资源。运行时用于动态连接的Attr资源。 解决方案是为

  • 我正在尝试构建一个基于Spring的web应用程序,我想从配置一个基于存储在数据库表中的用户名和密码元组的简单身份验证系统开始。 我的理解是,使用Spring security可以很容易地实现这一点,但我无法使其工作。 下面是我的web.xml文件。 跟随servlet-context.xml文件。bob和sam用户用于测试目的。在我得到这个权利之后,我将切换到一个基于JDBC的用户服务。 当我将

  • 问题内容: 我的问题是如何配置Spring MVC应用程序以同时允许 应用程序应提供静态资源(css,js,图像…) 根网址()应该由Spring控制器提供 我已经阅读了如何在SpringMVC中处理静态内容?,使用Spring映射到web.xml中的根,找不到静态资源,并且Tomcat在Spring MVC应用程序上提供静态资源。所有人都提供了可行的解决方案,直到最近,我还是将它们用作烹饪食谱,

  • 投资管理 跨境贸易 在国际贸易活动中,买卖双方可能互不信任。因此需要两家银行作为买卖双方的保证人,代为收款交单,并以银行信用代替商业信用。 区块链可以为信用证交易参与方提供共同账本,允许银行和其它参与方拥有经过确认的共同交易记录并据此履约,从而降低风险和成本。 一带一路 一带一路中对区块链技术的探索应用,能让原先无法交易的双方(例如,不存在都认可的国际货币情况下)完成交易,并且降低贸易风险、减少成