Я создаю надстройку 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 работают (или обещания в целом). Что я здесь не так делаю?
Спасибо!