在我的Excel加载项中我存储了一系列范围地址,我也知道当前选择的单元格。我需要遍历由存储地址定义的所有范围,并检查所选单元格是否在其中一个中(如果存在交集)。在同步世界中它很容易,但我无法弄清楚如何在office.js的异步世界中做到这一点。
我发现了这篇帖子Best way to write loops with promises (ctx.sync) in JavaScript API for Office,其中Michal为链接异步调用显示了一个很好的模式,但是,我有一些问题。
为了让代码在这里我复制粘贴它:
function loadAll () {
var ranges = ["A:A", "B:B", "C:C", "D:D", "E:E"];
var sheet = "Sheet1";
// Create a starter promise object
var promise = new OfficeExtension.Promise(function(resolve, reject) { resolve (null); });
for (var i = 0; i < ranges.length; i++) {
// Create a closure over i, since it's used inside a function that won't be immediately executed.
(function(i) {
// Chain the promise by appending to it:
promise = promise.then(function() {
return loadRange(ranges[i], sheet);
})
})(i);
}}
function loadRange (range, sheet) {
return Excel.run(function (ctx) {
var r = ctx.workbook.worksheets.getItem(sheet).getRange(range);
r.load('address');
return ctx.sync().then(function() {
console.log(r.address);
});
});
}
问题:
1)为什么for-i循环中存在自执行的内部函数?仅仅是不够:
for (var i = 0; i < ranges.length; i++) {
// Chain the promise by appending to it:
promise = promise.then(function() {
return loadRange(ranges[i], sheet);
})
}}
2)如果找到交叉点,我需要修改它以停止链。我怎样才能做到这一点?
3)您是否会向我推荐一些其他方法如何迭代excel对象(例如,范围)来搜索某些内容(列中的第一个空单元格等等)?
由于
菲利普