У меня есть веб-приложение Google Apps Script, которое использует массив объектов, созданных из электронной таблицы Google. Приложение использует jquery и miniSearch для предоставления пользовательских функций.
В настоящее время я запускаю серверную функцию с обработчиком успеха в начале тега HTML и обновляю «глобальную» переменную массивом объектов, объявленных перед ней.
Индекс.html:
<script>
let data
google.scripts.run
.withSuccessHandler(payload=>{
data = payload}).getLinks() //[{link:body}, {link1:body1}]
setTimeout(()=>{
const documents = data
miniSearch = new miniSearch(...)
miniSearch.addAll(documents)}, 2500)
...
</script>
Код.gs
function getLinks(){
.
.
.
let values = sheet.getRange(1, 1, lastRow, lastCol)
for (let row = 0; row < lastRow; row++) {
let entry = new Data(row + 1, values[row][0], values[row][1], values[row][2], values[row][3], values[row][4], values[row][5], values[row][6])
allTitles.push(entry)
}
return allTitles
}
Я имитирую ожидание завершения google.scripts.run, устанавливая setTimeout 2500 мс для выполнения индексации miniSearch (которое зависит от вышеупомянутого массива), и большую часть времени это работает.
Проблема в том, что перед тем, как приложение будет запущено в первый раз за заданный период, содержимое не кэшируется, а выполнение занимает больше времени, чем setTimeout, поэтому, как и ожидалось, функция поиска дает сбой, поскольку у нее нет данных для запуска. на.
Мой вопрос: как заставить код ждать и подтверждать, что google.scripts.run вернул необходимые данные?
Я пытался сделать это с помощью обычных обещаний или асинхронных функций ожидания, но, насколько я понимаю, Google выполняет свои серверные функции асинхронно, и нет никакого способа сказать (то есть в коде), завершено ли оно, я пытался запустить его как $(function(){google.script.run..})
как попытаться загрузить содержимое сразу после загрузки DOM, но безрезультатно..
Обработчик успеха запускается сразу после возврата серверной функции, поэтому я думаю, что это подходящий инструмент для того, что вы хотите сделать. Для вас это невозможный вариант? Можете ли вы объяснить причины этого?
@cooper, запускающий его внутри обработчика успеха (забыл упомянуть об этом), работает в том смысле, что он не выдает ошибку, но весь механизм поиска и обработчики действительно перестают отвечать.
Пожалуйста, редактировать вопрос, чтобы добавить к нему все соответствующие детали, включая минимальный воспроизводимый пример.
@g00g the whole searching mechanism and handlers get really unresponsive
Можешь объяснить, что ты имеешь в виду?
Единственный способ убедиться, что он завершится, - это сделать это. Если он не отвечает, проблема заключается в getLinks, Data или чем-то еще, что такое miniSearch.
<script>
const documents = null;
google.scripts.run.withSuccessHandler( function(payload) {
documents = payload;
miniSearch = new miniSearch(...);
miniSearch.addAll(documents);
}.getLinks(); //[{link:body}, {link1:body1}]
...
</script>
Я не уверен, но просто забудьте о задержке и сделайте это внутри обработчика успеха