Как я могу сделать скрипт, который всегда выполняется первым, чтобы выполняться последним? - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть два сценария, один из которых всегда выполняется первым из-за асинхронного программирования.

Мне нужно сделать сценарий, который выполняется первым, чтобы выполнять после другого.

Я программирую в Google Apps Script

Скрипт, который всегда выполняется первым

<script src="https://p.trellocdn.com/embed.min.js" defer></script>

Скрипт, который я хочу выполнить первым

  <script>
     google.script.run.withSuccessHandler(myname => {
     var elem = document.getElementById('myLink');
     elem.href = myname;
     }).getCardById();
  </script> 

Функция getCardById ()

function getCardById(){
  var app = SpreadsheetApp;
  var activeSp = app.getActiveSpreadsheet();
  var activeSheet = activeSp.getActiveSheet();
  var linkCol = activeSheet.getRange("B2").getValue();
  //Logger.log(' LINKCOL:' + linkCol);
  return linkCol;
}

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Проблема

Изменить порядок загрузки сценариев, где оба сценария выполняют асинхронных задач.

Решение

Как насчет загрузки старого доброго (ну вроде) динамического c контента? Примите во внимание следующее: вы хотите вызвать внутреннюю функцию getCardById(), как только загрузится контент, , затем загрузить библиотеку Trello и , а затем что-то с ней сделать. Таким образом, вам необходимо:

  1. Сделать асин c материал с getCardById()
  2. Загрузить библиотеку внутри withSuccessHandler()
  3. Присоединить load слушатель, чтобы убедиться, что библиотека загружена
  4. Выполните подготовку внутри обработчика load
  5. Затем выполните другие действия

Поскольку, судя по вашему коду, ваша цель вероятна Для встраивания карт Trello со ссылками, извлеченными из электронной таблицы, есть вспомогательная функция window.TrelloCards.load(), которая при необходимости выполняет поиск карт.

Образец

<blockquote class="trello-card">
  <a id="card">Trello Card</a>
</blockquote>

<script>

  (() => {

    google.script.run.withSuccessHandler(() => {

      const tag = document.createElement('script');

      tag.src = "https://p.trellocdn.com/embed.min.js";

      tag.addEventListener('load', () => {

        //can start doing something cool...

        const elem = document.querySelector('#card');

        elem.href = 'your card url';

        window.TrelloCards.load(document); // <-- this triggers the lookup
      });

      document.body.append(tag);

    }).doSomethingServerSide();

  })();

Ссылка

  1. По запросу встраивание в Atlassian
0 голосов
/ 04 апреля 2020

Есть проблема. Вот что означает отсрочка: The defer attribute tells the browser that it should go on working with the page, and load the script “in background”, then run the script when it loads. Scripts with defer never block the page. Scripts with defer always execute when the DOM is ready, but before DOMContentLoaded event.

Таким образом, этот скрипт будет запускаться сразу после загрузки DOM, но до наступления события window.onload. И приведенный ниже скрипт требует, чтобы DOM уже был загружен до того, как он сможет работать, поэтому вам нужно поместить его в window.onload ...

<script>
     google.script.run.withSuccessHandler(myname => {
     var elem = document.getElementById('myLink');
     elem.href = myname;
     }).getCardById();
</script> 

Так что я не думаю, что вы получите вас Wi sh. Но возможно, что кто-то, кто знает Javascript лучше, чем я, может включить oop и спасти день.

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