2

配列を作成する関数は次のとおりです。

//retrieve calendar id's
function getCalendarId(){
    gapi.client.load('calendar', 'v3', function() {
        var request = gapi.client.calendar.calendarList.list();
        request.execute(function(resp) {
            var calendarID = [];
            for (var i = 0; i < resp.items.length; i++) {
                var ID = resp.items[i].id;
                var calendarSummary = resp.items[i].summary;
                var calendarLocation = resp.items[i].location;
                var calendarDescription = resp.items[i].description;
                if (calendarDescription && calendarDescription.indexOf("Resource Tracker") != -1) {
                        var index = calendarID.length;
                        calendarID[index] = ID;
                }//endif
            }//end for
            console.log(typeof calendarID);
            return calendarID;
        });//end request.execute function(resp)
    });//end client.load function
}//end getCalendarId

そして、これを割り当てる関数は次のとおりです。

function submitEvents(numHorses){
   var startdate = $("#from").val();
   var enddate = $("#to").val();
   var horsetypes = [];
   var calid = [];
   console.log(typeof(calid));
   calid = getCalendarId();
   console.log(typeof(calid));
   for (i=0; i<numHorses;i++){
      horsetypes[i] = $( "#type"+i).val();
      addEvent(calid[i%calid.length], startdate, enddate, horsetypes[i]);
   }//end for           
  };//end submitEvents

型を調べてみると、calid=getCalendarID(); を代入すると、calid=getCalendarID(); を代入すると、calid は返される直前のオブジェクト、calid はオブジェクトになります。calid の型は未定義になります。

しばらくの間、頭を壁にぶつけていました。どんな助けでも大歓迎です!

4

2 に答える 2

2

最も外側の関数からは何も返されません。戻り値がないため、関数の戻り値に設定される変数は未定義に設定されます。内部の匿名関数にはreturn、API にとって意味がある場合とない場合があります (おそらくない) が含まれています。

本当の問題は、カレンダー API の呼び出しに任意の時間がかかる可能性があることです (非同期です)。そのため、単一の (同期) 関数内で値を設定して、それが機能することを期待することはできません。リクエストがリモートサーバーとの間でやり取りされている間、Javascript は実行を停止しません。

同様の問題/回答: JavaScript 関数の戻り値が機能しない

他の場所を使用している可能性があるgetCalendarIdため、独自の関数を使用することを検討し、Google カレンダー関数が返されたときにそれを呼び出すことができます。

function getCalendarId(callback){                            // !!!
  gapi.client.load('calendar', 'v3', function() {
    var request = gapi.client.calendar.calendarList.list();
    request.execute(function(resp) {
      var calendarID = [];
      for (var i = 0; i < resp.items.length; i++) {
        // omitted for brevity
      }//end for
      console.log(typeof calendarID);
      callback(calendarID);                                  // !!!
    });//end request.execute function(resp)
  });//end client.load function
}//end getCalendarId

function submitEvents(numHorses){
  // omitted for brevity
  getCalendarId(function(calid) {                            // !!!
    console.log(typeof(calid));
    for (i=0; i<numHorses;i++){
      // omitted for brevity
    }//end for
  });
};//end submitEvents
于 2012-10-31T06:04:20.970 に答える
-1
//retrieve calendar id's
function getCalendarId(){
var calendarID = [];
    gapi.client.load('calendar', 'v3', function() {
        var request = gapi.client.calendar.calendarList.list();
        request.execute(function(resp) {

            for (var i = 0; i < resp.items.length; i++) {
                var ID = resp.items[i].id;
                var calendarSummary = resp.items[i].summary;
                var calendarLocation = resp.items[i].location;
                var calendarDescription = resp.items[i].description;
                if (calendarDescription && calendarDescription.indexOf("Resource Tracker") != -1) {
                        var index = calendarID.length;
                        calendarID[index] = ID;
                }//endif
            }//end for
            console.log(typeof calendarID);

        });//end request.execute function(resp)
    });//end client.load function
return calendarID;
}//end getCalendarId

これはうまくいくはずです。CalenderID呼び出されている外部関数に対して宣言する必要があります。あなたのコードでは、calenderID別の関数内に戻っています。load

于 2012-10-31T06:06:03.703 に答える