2013-07-11 65 views
4

因此,我正在編寫一個使用RequireJS和Socket.io的應用程序,檢查socket.io資源是否可用,然後在連接時引導應用程序。如果socket.io曾經暫時關閉,我希望有幾次需要輪詢資源,直到它可用,然後繼續初始化應用程序。RequireJS提供的資源輪詢

不幸的是(或者幸運的是?)似乎有某種緩存機制需要爲不加載的腳本註冊腳本管理器,以便在錯誤回調中執行setTimeout來重新調用socketio require功能即使資源可用,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上)運行,但取決於節點/ socket.io服務,我相信這個服務有時會失效。這不是必須的,但是如果應用程序在節點服務器恢復後立即在瀏覽器中啓動(假設用戶進入頁面時它已關閉),我認爲這將很酷。 – zigzackattack

回答

6

我知道這是一個老問題,但它是耐人尋味給我,讓我看着它...

有您需要調用require.undef method以便告訴RequireJS不要緩存負載的先前故障狀態。另請參閱errbacks示例。

然後,您可以簡單地使用空回調調用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(); 
}); 
+0

這真是太棒了,正是我在找的東西!謝謝。 – zigzackattack