Javascript 轮询RequireJS可用的资源
因此,我正在使用RequireJS和Socket.io编写一个应用程序,检查Socket.io资源是否可用,然后在连接时引导应用程序。如果socket.io暂时停止运行,我希望对资源进行几次requireJS轮询,直到资源可用,然后继续初始化应用程序 不幸的是(或者可能幸运的是?)require中似乎有某种缓存机制,为未加载的脚本注册scripterrors,因此,如果在错误回调中执行setTimeout以重试socketio require函数,require将继续抛出错误,即使资源可用 这是一个疏忽还是有理由将此错误保留在缓存中?更重要的是,是否存在允许require Retry的变通方法 下面是我一直在尝试的一个例子: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将继续抛出错误,即使资源可用 这是
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服务,我确信有时会出现这种情况。这不是必须的,但我认为如果应用程序能在节点服务器恢复后立即在浏览器中启动(假设用户进入页面时应用程序已关闭),那就太棒了。这正是我想要的!谢谢