2017-04-24 27 views
0

我正在爲Google Calendar API調用特定事件,並且能夠獲取重複值。Javascript - Google API GET:Value null在谷歌API調用之外

function getRecurrence(payload) { 
    console.log('payload = ' + payload); 
    var recurrence = ''; 
    if (payload != undefined) { 
     var requestRecurringEvent = window.gapi.client.calendar.events.get({ 
     'calendarId': 'primary', 
     'eventId': payload 
     }); 
     requestRecurringEvent.execute(function(resp) { 
     console.log('requestRecurringEvent = ' + resp); 
     console.log('requestRecurringEvent.recurrence = ' + resp.recurrence); 
     recurrence = resp.recurrence; 

     console.log('recurrence (inside execute)= ' + recurrence); //NO ISSUE (YET): recurrence (inside execute) = RRULE:FREQ=WEEKLY;COUNT=10 

     return recurrence; 
     }); 
    } else { 
     return 'no recurrence value'; 
    } 
    } 

然而,當我再次出現價值迴歸的變量

var recurrence = getRecurrence(action.payload.calendarEventRecurringEventId); 
console.log('recurrence (outside execute) = ' + recurrence); //ISSUE: recurrence (outside execute) = undefined 

注:action.payload.calendarEventRecurringEventId是因爲我在值傳遞的有效載荷在終極版。

爲什麼在api調用中定義的值,但在api調用之外未定義?

謝謝!

UPDATE

承諾似乎已經採取我在正確的方向,因爲console.log('recurrence (outside execute) = ' + recurrence)打印的值,但它似乎沒有因爲一個空字符串仍被設定值完全解決了這個問題在減少。

var recurrencePromise = new Promise(function(resolve, reject) { 
     var payload = action.payload.calendarEventRecurringEventId; 
     console.log('action.payload.calendarEventRecurringEventId = ' + payload); 
     var recurrence = ''; 
     if (payload != undefined) { 
     console.log('getRecurrence payload != undefined'); 
     var requestRecurringEvent = window.gapi.client.calendar.events.get({ 
      'calendarId': 'primary', 
      'eventId': payload 
     }); 
     requestRecurringEvent.execute(function(resp) { 
      console.log('requestRecurringEvent = ' + resp); 
      console.log('requestRecurringEvent.recurrence = ' + resp.recurrence); 
      recurrence = resp.recurrence; 
      console.log('recurrence (inside execute)= ' + recurrence); 
      resolve(recurrence); 
     }); 
     } else { 
     reject(Error("It broke")); 
     } 
    }); 

    recurrencePromise.then(function(recurrence) { 
     console.log('recurrence (outside execute) = ' + recurrence); 
     var recurrenceTemp = 'RRULE:FREQ=WEEKLY;COUNT=10'; 
     return { 
     ...state, 
     calendarEventEndDate: action.payload.calendarEventEndDate, 
     calendarEventEndDateTime: action.payload.calendarEventEndDateTime, 
     calendarEventEndTime: action.payload.calendarEventEndTime, 
     calendarEventID: action.payload.calendarEventID, 
     calendarEventTitle: action.payload.calendarEventTitle, 
     calendarEventRecurringEventId: defaultIfUndefined(action.payload.calendarEventRecurringEventId, ''), 
     calendarEventRecurrence: recurrence, //ISSUE: this is where the value should be something like `RRULE:FREQ=WEEKLY;COUNT=10` instead of `''` 
     } 
    }, function(err) { 
     console.log(err); // Error: "It broke" 
    }); 

爲什麼在api調用之外還沒有定義正確的值?

回答

0

由於requestRecurringEvent.execute函數是異步的,這意味着您不能確定異步函數何時完成其執行(返回),這與保證返回值的同步函數不同,異步不行。你需要做什麼,如果你想使用的外部重現價值是,A)使用回調函數B)使用承諾(我相信谷歌API調用默認提供)

我建議你閱讀更多關於異步性在JavaScript中,掌握它的工作原理。

+0

我用Promises嘗試更新了我的問題。不幸的是,api調用的值仍然沒有設置爲reduce。任何想法爲什麼? @eersteam – Rbar