Как заставить код на стороне клиента ждать полного выполнения google.script.run?

У меня есть веб-приложение 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 16.03.2022 11:11

Обработчик успеха запускается сразу после возврата серверной функции, поэтому я думаю, что это подходящий инструмент для того, что вы хотите сделать. Для вас это невозможный вариант? Можете ли вы объяснить причины этого?

Iamblichus 16.03.2022 11:26

@cooper, запускающий его внутри обработчика успеха (забыл упомянуть об этом), работает в том смысле, что он не выдает ошибку, но весь механизм поиска и обработчики действительно перестают отвечать.

g00g 16.03.2022 11:54

Пожалуйста, редактировать вопрос, чтобы добавить к нему все соответствующие детали, включая минимальный воспроизводимый пример.

Rubén 16.03.2022 16:11

@g00g the whole searching mechanism and handlers get really unresponsive Можешь объяснить, что ты имеешь в виду?

Iamblichus 23.03.2022 09:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Единственный способ убедиться, что он завершится, - это сделать это. Если он не отвечает, проблема заключается в 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>

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