在惡劣的網絡條件下測試我們的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(); }
});