Ожидание асинхронной функции, возвращающей объект диапазона

Я хотел бы использовать функцию для возврата объекта диапазона, но потому что функция асинхронная, когда мой код достигает 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 метод.

Другие вопросы по тегам