Ожидание асинхронной функции, возвращающей объект диапазона
Я хотел бы использовать функцию для возврата объекта диапазона, но потому что функция асинхронная, когда мой код достигает currentRangeSelection.select();
, это все еще null
, Как заставить код ждать функцию getCurrentRangeSelection
так что я могу получить объект вместо undefined
?
РЕДАКТИРОВАТЬ 1 - Рик Киркхэм: я упростил код, так что теперь можно просто вставить его в стандартный шаблон Basic API Call (JavaScript) в ScriptLab, чтобы протестировать его.
После нескольких часов изучения Обещаний я думаю, что я близок к тому, что хочу, но все равно это не работает:
$("#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) Я попытался создать функцию, которая возвращает обещание, чтобы я мог вставить его в вызывающую then
цепь. Из-за этого мой единственный выбор состоял в том, чтобы передать в качестве ссылки параметр, который возвращает диапазон.
(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
вернуть уже loaded
объект?"
Спасибо за пример и ответы!
1 ответ
Попробуйте это: Редизайн getCurrentRangeSelection
функция для возврата объекта Promise. Затем позвоните then
метод объекта обещания для вызова currentRangeSelection.select()
Отредактируйте в свете комментариев ОП ниже и переписайте вопрос:
Пожалуйста, перейдите к этому образцу и посмотрите getDocumentFilePath
функция в файле home.js. Структурировать свой getCurrentRangeSelection
метод, как это и передать объект контекста ему в качестве параметра. Затем используйте объект контекста, чтобы получить текущий выбранный диапазон с context.workbook.getSelectedRange()
метод. Затем передайте то, что вы хотите вернуть (я полагаю, текущий выбранный диапазон) в качестве параметра resolve
метод.