Я переносил старый проект javascript в GAS и сталкиваюсь с блокировщиком при попытке запустить функции пространства имен из веб-приложения на стороне клиента. Пример быстрого кода:
var foo = function() {
function doBar() {
//do stuff
}
function doBang() {
//do stuff
}
return {
bar:doBar,
bang:doBang
}
}();
Хотя это было бы легко вызвать на стороне сервера через foo.bar()
, я столкнулся со стеной, пытаясь поговорить с этими функциями из моего веб-приложения. Я надеялся сделать что-то вроде этого:
<script>
google.script.run.withSuccessHandler(callback).foo.bar();
function callback() {
//do stuff
}
</script>
Но, увы, это не работает. Есть ли что-то, что мне не хватает, или другой способ заставить это работать без какой-либо функции обработчика, не содержащейся в пространстве имен, которая проходит через мои пространства имен?
Поскольку это миграция проекта, у меня есть очень хорошо структурированный, но огромный набор пространств имен; Для этого потребуется очень длинная и надежная функция обработчика, поэтому я бы хотел по возможности избегать этого.
@TheMaster, если я вас не понимаю, это то, что я имел в виду, используя функцию обработчика или маршрутизатора. Кошмар в этом случае, потому что у меня много сотен маршрутов в моих пространствах имен, и я не слишком в восторге от использования evals.
Не видя проблемы. Мне кажется двухстрочная модификация? return ({ bar:doBar, bang:doBang })[internalFunctionName]()
?
@TheMaster Я не уверен, что понимаю, что вы имеете в виду. Не могли бы вы уточнить?
Не могли бы вы пояснить, насколько сложной будет функция обработчика, если редактировать ответит на ваш вопрос?
Вам понадобится эта функция обработчика. Сценарий приложений не понимает, что вы вызываете серверную функцию, если добавляете точку, и поэтому вы получаете эту ошибку:
TypeError: Cannot read properties of undefined (reading 'bar')
Я предлагаю вам запросить эту функцию с помощью этот шаблон системы отслеживания проблем, если вы хотите, чтобы она была реализована.
Почему бы просто не передать как параметр?
google.script.run.withSuccessHandler(callback).foo(internalFunctionName)