Office js 等待异步函数返回范围对象
我想使用一个函数返回一个范围对象,但由于该函数是异步的,所以当我的代码到达Office js 等待异步函数返回范围对象,office-js,scriptlab,Office Js,Scriptlab,我想使用一个函数返回一个范围对象,但由于该函数是异步的,所以当我的代码到达currentRangeSelection.select()时,它仍然是null。如何强制代码等待函数getCurrentRangeSelection,以便获得对象而不是undefined 编辑1-Rick Kirkham:我简化了代码,现在可以将其粘贴到ScriptLab中的默认基本API调用(JavaScript)模板中进行测试 在研究了几个小时的承诺之后,我想我已经接近我想要的了,但它仍然不起作用: $("#run
currentRangeSelection.select()时代码>,它仍然是null
。如何强制代码等待函数getCurrentRangeSelection
,以便获得对象而不是undefined
编辑1-Rick Kirkham:我简化了代码,现在可以将其粘贴到ScriptLab中的默认基本API调用(JavaScript)模板中进行测试
在研究了几个小时的承诺之后,我想我已经接近我想要的了,但它仍然不起作用:
$("#run").click(run);
function run() {
var currentRangeSelection;
return Excel.run(function (context) {
return context.sync()
.then(function () {
return getCurrentRangeSelection(currentRangeSelection)
})
.then(function () {
// this returns an error because currentRangeSelection is undefined:
console.log("Outside the function: " + currentRangeSelection.address);
currentRangeSelection.select();
return context.sync();
})
})
.catch(function (error) {
console.log(error);
});
}
function getCurrentRangeSelection(rangeSelection) {
return Excel.run(function (context) {
return context.sync()
.then(function () {
rangeSelection = context.workbook.getSelectedRange();
rangeSelection.load();
return context.sync();
})
.then(function () {
// this works:
console.log("Inside the function: " + rangeSelection.address);
return context.sync();
});
});
}
如您所见,现在函数返回一个Promise
,因为它(我认为)是Excel.run
函数的返回值,现在我将所需的返回范围作为参数传递,但仍然不起作用。
还有什么建议吗
编辑2-里克·科克汉姆
(1) 我试图创建一个返回承诺的函数,这样我就可以将它插入调用者然后链中。因此,我唯一的选择是将返回范围的参数作为引用传递
(2) 是的,我同意你的看法。我想(1)解释了为什么我没有首先返回范围对象
(3) 是的,我修好了
(4) 最初的函数更复杂,来自Office JS API的单个方法无法返回我真正想要的结果。我通过这样做解决了我的问题:
$("#run").click(run);
function run() {
var testRange;
return Excel.run(function (context) {
return context.sync()
.then(function () {
testRange = getCurrentRangeSelection(context);
testRange.load();
return context.sync();
})
.then(function () {
console.log(testRange.address); // this works
return context.sync();
});
}).catch(function (error) {
console.log(error);
});
}
function getCurrentRangeSelection(context) {
var rangeSelection = context.workbook.getSelectedRange();
var activeWorksheet = context.workbook.worksheets.getActiveWorksheet();
var usedRange = activeWorksheet.getUsedRange();
return usedRange.getIntersection(rangeSelection);
}
您的编辑回答了我的下一个问题:“如果我希望函数getCurrentRangeSelection
返回一个已加载的对象,该怎么办?”
谢谢你的例子和答案 尝试以下操作:重新设计getCurrentRangeSelection
函数以返回承诺对象。然后调用promise对象的Then
方法来调用currentRangeSelection.select()
根据OP下面的评论进行编辑,并重写问题:
请转到并查看home.js文件中的getDocumentFilePath
函数。像它一样构造getCurrentRangeSelection
方法,并将上下文对象作为参数传递给它。然后使用context对象通过context.workbook.getSelectedRange()
方法获取当前选定的范围。然后将要返回的内容(我认为是当前选择的范围)作为参数传递给resolve
方法。尝试以下操作:重新设计getCurrentRangeSelection
函数以返回承诺对象。然后调用promise对象的Then
方法来调用currentRangeSelection.select()
根据OP下面的评论进行编辑,并重写问题:
请转到并查看home.js文件中的getDocumentFilePath
函数。像它一样构造getCurrentRangeSelection
方法,并将上下文对象作为参数传递给它。然后使用context对象通过context.workbook.getSelectedRange()
方法获取当前选定的范围。然后将您想要返回的内容(我想是当前选择的范围)作为参数传递给resolve
方法。谢谢,但我不知道怎么做。有参考资料吗?只要Bing“JavaScript承诺”,你就会得到很多点击率,包括初学者指南和教程。谢谢你的提示,但它仍然不起作用。你能看到编辑后的注意事项吗?看我修改后的答案:还有,关于你的最新代码的一些谜题:(1)为什么你故意把一个未定义的对象传递给一个方法?(2) 名为“GetWhather”的函数应返回一个“whather”对象。getCurrentRangeSelection不会返回当前选定的范围。它只是将其分配给一个变量,而对该变量不做任何处理。(3) 您正在另一个Excel.run中调用一个Excel.run。我认为这不是一个好的做法。(4) 您希望getCurrentRangeSelection执行哪些不是由context.workbook.getSelectedRange()完成的操作;?我又编辑了一遍。谢谢你的回答和链接!谢谢,但我不知道怎么做。有参考资料吗?只要Bing“JavaScript承诺”,你就会得到很多点击率,包括初学者指南和教程。谢谢你的提示,但它仍然不起作用。你能看到编辑后的注意事项吗?看我修改后的答案:还有,关于你的最新代码的一些谜题:(1)为什么你故意把一个未定义的对象传递给一个方法?(2) 名为“GetWhather”的函数应返回一个“whather”对象。getCurrentRangeSelection不会返回当前选定的范围。它只是将其分配给一个变量,而对该变量不做任何处理。(3) 您正在另一个Excel.run中调用一个Excel.run。我认为这不是一个好的做法。(4) 您希望getCurrentRangeSelection执行哪些不是由context.workbook.getSelectedRange()完成的操作;?我又编辑了一遍。谢谢你的回答和链接!仅供参考,第一个代码的部分问题在于,您实际上在执行两个不同的Excel.run
-s。当你这样做的时候,事情会变得非常混乱。我最近在“使用“线性”Excel.run或Word.run流之外的对象(例如,在按钮单击回调中,在setInterval中,等等)”中添加了一个关于它的章节。然而,这种情况并不真正适用于您,因为您正试图拥有一个线性流——如果它是一个线性流,那么一个Excel.run
就足够了。希望这是有意义的。我不确定你是否还有问题,或者Ricky是否已经回答了所有问题——但如果你仍然有问题,只需在单独的StackOverflow线程上提问即可。所有问题都已回答,谢谢你的评论,是的,我读了你关于这一部分的书,终于理解了这个概念!仅供参考,第一个代码的部分问题在于,您实际上在执行两个不同的Excel.run
-s。事情会变得非常混乱