2017-03-31 105 views
1

在惡劣的網絡條件下測試我們的Office.js加載項時,遇到了一個問題。以下錯誤被拋出我們的腳本加載即使之前:
Uncaught Office.js has not been fully loaded yet. Please try again later or make sure to add your initialization code on the Office.initialize function.有沒有辦法在Office.js中禁用初始化定時器?

調試了幾個小時後,我們發現下面的一段代碼Office.js

g.waitForFunction(function() { 
    return Microsoft.Office.WebExtension.initialize != undefined 
}, function(a) { 
    if (a) { 
     if (h.prepareApiSurface) 
      Microsoft.Office.WebExtension.initialize(h.getInitializationReason(b)); 
     else 
      h.prepareRightBeforeWebExtensionInitialize(b); 
     h.prepareRightAfterWebExtensionInitialize && h.prepareRightAfterWebExtensionInitialize() 
    } else 
     throw "Office.js has not been fully loaded yet. Please try again later or make sure to add your initialization code on the Office.initialize function." 
}, 400, 50) 

waitForFunction方法需要4個參數:
function - 狀態檢查函數返回一個布爾值。
function - 當狀態檢查函數返回true或方法失敗時調用的回調函數。
Number - 重試次數。
Number - 嘗試之間的毫秒數。

根據我們找到的源代碼,Office加載項在框架超時並且簡單放棄之前需要約20秒才能初始化。這在Office 365聯機和連接速度慢的情況下特別有問題。

以下附加重現該問題:

<head> 
    <meta charset="UTF-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> 
    <title>Test Init</title> 
    <script src="//appsforoffice.microsoft.com/lib/1/hosted/office.js"></script> 
</head> 

<body class="ms-font-l" style="width:100%;height:100%;overflow:hidden;position:relative;"> 
<div id="app" style="height:100%"></div> 
<script> 
    console.log('Our script loaded...'); 
    setTimeout(function() { 
     Office.initialize = function() { 
      console.log('Our App Initialized!!!') 
     }; 
    }, 15000); 
</script> 
</body> 

</html> 

我的問題是,有沒有辦法繞過這個超時?或者至少增加它?也許使用類似:
Office.initialize(function() { /* ... */ });
而不是:
Office.initialize = function() { /* ... */};

如果沒有,會Office團隊考慮改變定時器,而不是使用一個屬性:

Object.defineProperty(Office, 'initialize', { 
    get: function() { return Office._initialize; }, 
    set: function(value) { Office._initialize = value; Office.triggerCodeDependantOnInitialize(); } 
}); 

回答

2

當前有沒有辦法避免超時。也就是說,在執行任何其他操作之前,您應該始終調用Office.initialize。總的來說,我的指導意見是把這個電話放在你頭上的底部。

<head> 
    <meta charset="UTF-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> 
    <title>Test Init</title> 
    <script src="//appsforoffice.microsoft.com/lib/1/hosted/office.js"></script> 
    <script> 
     Office.initialize = function() { 
      console.log('Office Initialized!!!')  

     }; 
    </script> 
</head> 

我然後使用事件來觸發任何額外的初始化代碼我需要當文檔準備好(即document.addEventListener("DOMContentLoaded", function(event){ })或JQuery的$(document).ready

相關問題