2013-07-11 1 views
4

Итак, я пишу приложение с использованием RequireJS и Socket.io, которое проверяет, доступен ли ресурс socket.io, а затем при подключении загружает приложение. В случае, когда socket.io когда-либо временно опускается, я бы хотел, чтобы несколько раз запрашивал запрос на ресурс для ресурса, пока он не будет доступен, а затем продолжите инициализацию приложения.Опрос по ресурсу, доступному с RequireJS

К сожалению (или, может быть, к счастью?) Кажется, что существует какой-то механизм кеширования, требующий регистрации скриптов для сценариев, которые не загружаются, так что если вы выполняете setTimeout в обратном вызове ошибки, , require будет продолжать выдавать ошибки, даже когда ресурс становится доступным.

Является ли это надзором или есть причина для сохранения этой ошибки? Что еще более важно, есть ли временное решение, позволяющее потребовать ретроспекцию?

Вот пример того, что я пытался:

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

Понятно, что это скорее концептуальный вопрос, но я быстро обновил сообщение. – zigzackattack

+0

Socketio отображается в нужном месте в моем require.config. Причина, по которой мой скрипт доступен, заключается в том, что приложение запускается внутри Drupal (на apache), но зависит от услуги node/socket.io, и я уверен, что это произойдет. Это не обязательно, но я подумал, что было бы здорово, если бы приложение запустилось в браузере, как только сервер узлов вернется (если он зашел, когда пользователь пришел на страницу). – zigzackattack

ответ

6

Я знаю, что это старый вопрос, но это было интригующим для меня, так что я посмотрел в него ...

Eсть a require.undef method вам необходимо позвонить, чтобы сообщить RequireJS не кэшировать предыдущий статус отказа загрузки. См. Также пример errbacks.

Затем вы можете просто потребовать повторный вызов с нулевым обратным вызовом. Первоначальный обратный вызов все равно будет вызван - нет необходимости в рекурсии. Что-то вроде этого:

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(); 
}); 
+0

Это фантастика и именно то, что я искал! Благодарю. – zigzackattack

Смежные вопросы