我很难理解何时使用 context.sync()
。
这是一个基本的例子,但它又让我缺乏理解:
Excel.run(function (context){
const wb = context.workbook;
const ws = wb.worksheets.getActiveWorksheet();
// should never happened, but is it correct to check like this ?
if (wb === null) {
// IS IT CORRECT TO DO THIS ?
// I just want to exit the function
// return; would be enough ? What's going on in the callstack?
return context.sync();
}
ws.load("name");
return context.sync().then(function() {
var name = wb.name;
// do stuff
var range = ws.getRangeByIndexes(1,1,10,10);
return context.sync().then(function() {
ws.names.add("NEWRANGE", range);
// mandatory return context.sync() to refresh Excel object ?
// doesn't work otherwise for me
return context.sync();
});
}
}).catch(function(error) {
// do stuff
}
如果有人能解释一下,那就太受欢迎了:)
干杯。
最佳答案
我认为如果您将这些对象视为代理对象,将会有所帮助。它们只是真实对象的表示,并非所有属性都在代理对象上可用,因为它们不需要可用。同样,对代理对象所做的更改不会更新真实对象。 context.sync() 用于将代理对象与真实对象同步。
查看您的代码,第一个 context.sync() 是不必要的,因为您不需要检索任何内容或进行任何更改。实际上整个情况if (wb === null)
是不必要的,因为 context.workbook 不能为 null。
一旦您尝试 ws.load("name");
,您需要 context.sync() 因为您尝试访问需要从真实对象加载的代理对象上的属性。
当您调用var range = ws.getRangeByIndexes(1,1,10,10);
时,您不需要 context.sync(),因为您只是获取另一个代理对象,但没有进行任何更改,也没有访问任何属性。
但是自从 ws.names.add("NEWRANGE", range);
是一个真正的更改,您需要 context.sync() 来反射(reflect)真实对象上的更改。从技术上讲,最后一个 context.sync() 不是必需的,因为 Excel.run 在运行 Excel.run() 内的所有内容后实际上会调用 context.sync()。也就是说,无论如何,有一个结束 context.sync() 是一个很好的做法。
您还可以在一个 context.sync() 中批量处理独立操作。自 var range = ws.getRangeByIndexes(1,1,10,10);
与 ws.names.add("NEWRANGE", range);
无关,您实际上可以将它们放在单个 context.sync() 后面。
我还建议改用 TypeScript 来保持代码更干净、更容易理解。尝试在 Excel 中使用 ScriptLab。有很多示例可以帮助您总体了解 context.sync() 和 office-js。
最后,这是您可以编写的代码来完成同样的事情。
Excel.run(function (context) {
const wb = context.workbook;
const ws = wb.worksheets.getActiveWorksheet();
ws.load("name");
return context.sync().then(function () {
var name = wb.name;
// do stuff
var range = ws.getRangeByIndexes(1, 1, 10, 10);
ws.names.add("NEWRANGE", range);
return context.sync();
});
}).catch(function (error) {
// do stuff
});
哦,你应该按照辛迪的建议看看迈克尔的书。
关于javascript - Office-js Excel 插件 : when to return context. 同步(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51946582/