2017-04-24 25 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