Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Office js 等待异步函数返回范围对象_Office Js_Scriptlab - Fatal编程技术网

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。事情会变得非常混乱