Как запустить функцию после того, как функция GAS действительно закончилась? - PullRequest
2 голосов
/ 17 октября 2019

Как заставить этот otherFunc () запускаться после того, как myFunc действительно завершился?

async function func() {
  const res = await (() => new Promise(r => google.script.run.withSuccessHandler((e) => r(myFunc(e))).serverFunc()))();
  console.log(res);
  otherFunc();          //this function still executed before myFunc end, except i use setTimeOut
  console.log("done");
}

Это то, что внутри myFunc ()

function myFunc(){
  var tbody = document.getElementById("table-permintaan");
  var thead = tbody.firstElementChild;
  while (tbody.hasChildNodes())  
    tbody.removeChild(tbody.firstChild);
  tbody.appendChild(thead);
  google.script.run.withSuccessHandler(function(nama){
   dataArray.forEach(function(r){
     justCreatingTableRows();
  }).listNamaBarang();
}
}

Это то, что внутриotherFunc ()

function otherFunc(){
   var btns = document.getElementsByTagName('button');
  var mdls = document.getElementsByClassName("modal_detail");
  var cds = document.getElementsByClassName("close_detail");
  for(var i = 0;i<btns.length-1;i++){
     btns[i].addEventListener("click",function(){
         document.getElementById("mdl"+this.id.slice(3)).style.display = "block";
     });
     mdls[i].style.display = "none";
  }
  for(var i=0;i<cds.length;i++){
     cds[i].addEventListener("click",function(){
        for(var j = 0;j<mdls.length;j++){
        console.log(this.id.slice(3) , mdls[j].id);
        if (this.id.slice(3) == mdls[j].id.slice(3)) {
           mdls[j].style.display = "none";
           return;
        }   
     }
     });
  }
}

Использование обещания не заставило otherFunc () работать после myFunc (), мне все еще нужно использовать setTimeOut, что не подходит для этого случая.

1 Ответ

4 голосов
/ 17 октября 2019

Когда ваш скрипт модифицируется, как насчет этой модификации? Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Точки модификации:

  • В вашем скрипте google.script.run также используется в функции myFunc(). google.script.run запускается с асинхронным процессом. Таким образом, когда func() выполняется, serverFunc(), myFunc(e) и otherFunc() в порядке, в то время как function(nama) из google.script.run.withSuccessHandler(function(nama){ })).listNamaBarang() заканчивается в этом порядке. При этом возникает проблема в вашем вопросе. Это уже упоминалось в комментарии TheMaster .
    • Чтобы избежать этого, измените myFunc() как func().

Модифицированный скрипт:

async function myFunc() {
  var tbody = document.getElementById("table-permintaan");
  var thead = tbody.firstElementChild;
  while (tbody.hasChildNodes())  
    tbody.removeChild(tbody.firstChild);
  tbody.appendChild(thead);

  // Below script was modified.
  const res = await (() => new Promise(r => google.script.run.withSuccessHandler(function(nama) {
    dataArray.forEach(function(r){justCreatingTableRows(r)});
    return r("done at myFunc()");
  }).listNamaBarang()))();
  console.log(res) // done at myFunc()
}
  • В этом случае, я думаю, что другие функции не требуются для изменения.
  • Эта модификация предполагает, что объявлено dataArray.

Ссылка:

  • Класс google.script.run
    • google.script.run - это асинхронный клиентский API JavaScript, доступный на страницах HTML-службы, который может вызывать серверФункции скрипта сторонних приложений.

...