因爲Excel.run
返回承諾,您可以鏈接它與.then
並保證順序。即,
Excel.run(function(ctx) { ... return ctx.sync(); ... })
.then(function() {
return Excel.run(function(ctx) { ... return ctx.sync(); ... })
})
.then(function() {
return Excel.run(function(ctx) { ... return ctx.sync(); ... })
});
這就是說...這將是相當沒有效率。更好的方法是先裝載您在一個批處理需要的所有對象,只創建一個網絡往返(與Excel在線尤爲重要......但明顯甚至在桌面上):
function loadAll() {
Excel.run(function(ctx) {
var ranges = ["A:A", "B:B", "C:C", "D:D", "E:E"];
var sheet = "Sheet1";
var loadedRanges = [];
for (var i = 0; i < ranges.length; i++) {
var r = ctx.workbook.worksheets.getItem(sheet).getRange(ranges[i]);
r.load('address');
loadedRange.push(r);
}
return ctx.sync()
.then(function() {
for (var i = 0; i < loadedRanges.length; i++) {
console.log(loadedRanges[i].address);
}
});
});
}
UPDATE
如果按照評論,你最終需要做的是互相依賴的,並且每一個需要往返,因此就需要通過鏈接Excel.run
進行測序獨立的任務,我會推薦一些如下:
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);
});
});
}
〜Office Extensibility團隊開發人員Michael Zlatkovsky,MSFT
爲什麼您關心執行順序?什麼'Excel.run'返回? – Bergi
Excel.run()執行一個在Excel對象模型上執行操作的批處理腳本。批處理命令包括本地JavaScript代理對象和sync()方法的定義,這些方法同步本地和Excel對象之間的狀態並承諾解析。 ([overview](http://dev.office.com/docs/add-ins/excel/excel-add-ins-javascript-programming-overview)) – SoftTimur
我關心執行順序...因爲我要去到一些複雜的東西而不是'loadRange'或'console.log(r.address)',它們依賴於順序... – SoftTimur