GAS功能真正结束后如何运行功能?

时间:2019-10-17 01:56:39

标签: javascript google-apps-script promise async-await

在myFunc真正结束后如何使otherFunc()运行?

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;
        }   
     }
     });
  }
}

使用promise不能使otherFunc()在myFunc()之后运行,我仍然需要使用setTimeOut,这对这种情况不利。

1 个答案:

答案 0 :(得分:4)

修改脚本后,如何进行修改?请认为这只是几个答案之一。

修改点:

  • 在您的脚本中,google.script.run的功能中也使用了myFunc()。 google.script.run与异步进程一起运行。这样,在运行func()时,serverFunc()myFunc(e)otherFunc()依次运行,而function(nama)中的google.script.run.withSuccessHandler(function(nama){ })).listNamaBarang()则按此顺序运行。这样,您的问题就会出现。 TheMaster's comment已经提到了这一点。
    • 为避免这种情况,请像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

参考:

  • Class google.script.run
    •   

      google.script.run是HTML服务页面中可用的异步客户端JavaScript API,可以调用服务器端Apps脚本函数。