繁体   English   中英

如何让javascript等待Google-apps-script的结果?

[英]How to make javascript wait on the result of Google-apps-script?

我正在尝试使用Google-apps-script显示给定日期的所有事件,我的问题是javascript代码在脚本完成之前仍在继续,因此我的代码混乱了。 我如何使其暂停直到脚本返回结果,还是有比当前更好的方法呢?

Javascript:

<script>
 var currentDate = new Date();
 currentDate = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());
 currentDate = new Date(currentDate.getTime() - currentDate.getTimezoneOffset()*60*1000);

 function formatDate(date){
  //turns date into format "Month DD"
  date = date.toISOString();
  var months =["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
  var output = months[date.slice(5,7)-1]+" "+date.slice(8,10);
  return output;
 }

 function printEvents(day){
  //retrieve events from google calendar for given day
  google.script.run.withSuccessHandler(onSuccess).listUpcomingEvents(day.toISOString(), (new Date(day.getTime()+24*60*60*1000).toISOString()));
 }

 function printCalendar(date1){
  //print events for three days starting with the given day
  document.getElementById('calendar').innerHTML = formatDate(date1)+"<br />";
  printEvents(date1);
  document.getElementById('calendar').innerHTML += "<br />"+formatDate(new Date(date1.getTime()+24*60*60*1000))+"<br />";
  printEvents(new Date(date1.getTime()+24*60*60*1000));
  document.getElementById('calendar').innerHTML += "<br />"+formatDate(new Date(date1.getTime()+2*24*60*60*1000))+"<br />";
  printEvents(new Date(date1.getTime()+2*24*60*60*1000));
 }

 function onSuccess(events){
  if(events != undefined){
   for (i=0; i<events.length; i++){
    for (j=0; j<3; j++){
     document.getElementById('calendar').innerHTML += events[i][j]+"<br />";
    }
    document.getElementById('calendar').innerHTML += "<br />";
   }
  }
 }

printCalendar(currentDate);


</script>

Google脚本:

function listUpcomingEvents(dateMin, dateMax) {
  var calendarId = 'primary';
  var optionalArgs = {
    timeMin: dateMin,
    timeMax: dateMax,
    showDeleted: false,
    singleEvents: true,
    maxResults: 1,
    orderBy: 'startTime'
  };
  var response = Calendar.Events.list(calendarId, optionalArgs);
  var events = response.items;
  var calendar = []
  if (events.length > 0) {
    for (i = 0; i < events.length; i++) {
      var event = events[i];
      var when = event.start.dateTime;
      var descr = event.description;
      if (!when) {
        when = event.start.date;
      }
      if (!descr) {
        descr = "NaN"
      }
        calendar.push([event.summary, when, descr]);

    }
    return calendar;
  }
}

function doGet() {
  var output = HtmlService.createTemplateFromFile('calendar');
  return output.evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}

当前结果:

"date1"

"date2"

"date3"
"events1"
"events2"
"events3"

预期结果:

"date1"
"events1"

"date2"
"events2"

"date3"
"events3"

解决了见评论。

看起来像这里的承诺? stackoverflow.com/questions/14220321/…– Mark Schultheiss 28分钟前

@MarkSchultheiss谢谢,对同步和异步的阅读使我重写了代码,现在可以正常工作了。 我没有使用诺言,而是使用.insertAdjacentHTML()并给出了日期和ID以将其插入正确的位置。 – SJ_WTF

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM