Javascript 轮询RequireJS可用的资源

Javascript 轮询RequireJS可用的资源,javascript,node.js,requirejs,amd,socket.io,Javascript,Node.js,Requirejs,Amd,Socket.io,因此,我正在使用RequireJS和Socket.io编写一个应用程序,检查Socket.io资源是否可用,然后在连接时引导应用程序。如果socket.io暂时停止运行,我希望对资源进行几次requireJS轮询,直到资源可用,然后继续初始化应用程序 不幸的是(或者可能幸运的是?)require中似乎有某种缓存机制,为未加载的脚本注册scripterrors,因此,如果在错误回调中执行setTimeout以重试socketio require函数,require将继续抛出错误,即使资源可用 这是

因此,我正在使用RequireJS和Socket.io编写一个应用程序,检查Socket.io资源是否可用,然后在连接时引导应用程序。如果socket.io暂时停止运行,我希望对资源进行几次requireJS轮询,直到资源可用,然后继续初始化应用程序

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

这是一个疏忽还是有理由将此错误保留在缓存中?更重要的是,是否存在允许require Retry的变通方法

下面是我一直在尝试的一个例子:

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

我知道这是一个老问题,但对我来说很有趣,所以我研究了一下

为了告诉RequireJS不要缓存负载的先前故障状态,您需要调用一个函数。另见示例

然后,您可以简单地使用空回调再次调用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();
});
函数requireWithRetry(libname、cb、retryInterval、retryLimit){
//默认值
retryInterval=retryInterval | | 10000;
retryLimit=retryLimit | | 10;
var-retryCount=0;
var retryOnError=函数(err){
var failedId=err.requireModules&&err.requireModules[0];
if(retryCount
我觉得这更像是一个概念性的问题,但我已经用一个快速剪切的按钮更新了帖子。Socketio被映射到我的require.config中的正确位置。我的脚本之所以可用,是因为该应用程序在Drupal(apache)内部运行,但依赖于node/socket.io服务,我确信有时会出现这种情况。这不是必须的,但我认为如果应用程序能在节点服务器恢复后立即在浏览器中启动(假设用户进入页面时应用程序已关闭),那就太棒了。这正是我想要的!谢谢