我知道这是一个老问题,但它对我很有吸引力,所以我调查了一下......
您需要调用一个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();
});