【发布时间】:2017-02-23 10:48:58
【问题描述】:
几个月来,我们一直在使用 Excel JavaScript API 进行开发。我们一直在遇到与上下文相关的问题,这些问题由于未知原因得到了解决。我们无法复制这些问题,并想知道它们是如何解决的。最近类似的问题又开始出现了。 我们经常遇到的错误:
属性“地址”不可用。在阅读该物业之前 值,调用包含对象的加载方法并调用 关联请求上下文中的“context.sync()”。
我们认为,由于我们定义了多个函数来模块化项目中的代码,因此这些函数之间的上下文可能有所不同,而这些函数被忽视了。所以我们想出了通过 JavaScript 模块模式实现的单上下文解决方案。
var ContextManager = (function () {
var xlContext;//single context for entire project/application.
function loadContext() {
xlContext = new Excel.RequestContext();
}
function sync(object) {
return (object === undefined) ? xlContext.sync() : xlContext.sync(object);
}
function getWorksheetByName(name) {
return xlContext.workbook.worksheets.getItem(name.toString());
}
//public
return {
loadContext: loadContext,
sync: sync,
getWorksheetByName: getWorksheetByName
};
})();
注意:以上代码已缩短。添加了其他方法以确保在整个应用程序中使用单个上下文。 在实现单一上下文的同时,这一次,我们已经能够复制该问题。
Office.initialize = function (reason) {
$(document).ready(function () {
ContextManager.loadContext();
function loadRangeAddress(rng, index) {
rng.load("address");
ContextManager.sync().then(function () {
console.log("Address: " + rng.address);
}).catch(function (e) {
console.log("Failed address for index: " + index);
});
}
for (var i = 1; i <= 1000; i++) {
var sheet = ContextManager.getWorksheetByName("Sheet1");
loadRangeAddress(sheet.getRange("A" + i), i);//I expect to see a1 to a1000 addresses in console. Order doesn't matter.
}
});
}
在上述情况下,只有“A1”作为范围地址打印到控制台。我看不到正在打印的任何其他地址(A2 到 A1000)。只有 catch 块执行。谁能解释为什么会这样? 尽管我已经在上面编写了 for 循环,但这不是我的用例。在实际用例中,会出现这样的情况,即函数 a 中的一个范围对象需要加载范围地址。同时,另一个函数 b 也想加载范围地址。函数 a 和函数 b 在单独的任务上异步工作,例如创建表对象(表需要地址)和其他将数据粘贴到工作表(有调试语句来查看数据粘贴到哪里)。
这是我们的团队无法弄清楚或找到解决方案的事情。
【问题讨论】: