Office-JS Excel API: проблема с правильной цепочкой обещаний - PullRequest
2 голосов
/ 01 мая 2019

Я создаю надстройку Excel с использованием прямого (не транспонированного) JS, который выполняется в кадре IE11 внутри настольной версии Excel. Если это имеет значение, я также использую Vue в качестве структуры пользовательского интерфейса. У меня определены следующие два метода (среди прочего, но эти два являются самыми короткими, поэтому я буду использовать их для демонстрации своей проблемы):

protectSheet: function () {
            return Excel.run(function (context) {
                const sheet = context.workbook.worksheets.getActiveWorksheet();

                return context.sync().then(function () {
                    sheet.protection.protect({
                        userInterfaceOnly: true,
                        drawingObjects: false
                    }); // allow inserting comments

                    return context.sync();
                });
            }).catch(function (error) {
                console.log("error: " + error);
                if (error instanceof OfficeExtension.Error) {
                    console.log("Debug info: " + JSON.stringify(error.debugInfo));
                }
            });
        }

и

unProtectSheet: function () {
                return Excel.run(function (context) {
                    const sheet = context.workbook.worksheets.getActiveWorksheet();
                    sheet.load("protection/protected");

                    return context.sync().then(function () {
                        if (sheet.protection.protected) {
                            sheet.protection.unprotect();
                        }

                        return context.sync();
                    });
                }).catch(function (error) {
                    console.log("error: " + error);
                    if (error instanceof OfficeExtension.Error) {
                        console.log("Debug info: " + JSON.stringify(error.debugInfo));
                    }
                });
            }

Я тогда называю их следующим образом, надеясь, что это будет означать, что вторая функция начинает выполняться только после того, как первая полностью завершена:

onChange: function () {
        this.unProtectSheet()
            .then(this.protectSheet());
    }

Однако вторая функция запускается сразу после первой, не дожидаясь завершения первой. Я явно упускаю вопрос о том, как обещания Office-JS работают (или обещания в целом). Что я здесь не так делаю?

Спасибо!

1 Ответ

1 голос

Ты очень близко.

Однако, если вы используете синтаксис .then(funcName), вам нужно только дать указатель на функцию, а НЕ вызывать ее. То есть вместо .then(this.protectSheet()) отбросьте () и оставьте его как .then(this.protectSheet).

onChange: function () {
    this.unProtectSheet()
        .then(this.protectSheet);
}

Либо сделайте:

onChange: function () {
    this.unProtectSheet()
        .then(function() {
            return this.protectSheet();
        });
}

И кстати, у вас действительно должен быть ".catch" в конце, чтобы отлавливать любые ошибки, которые происходят в любой функции.

... И, конечно, это выглядело бы более чётко с async / await (например, с помощью TypeScript, Babel или чего-то ещё).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...