2015-10-22 75 views
1

我正在嘗試使用Google日曆API編寫我的第一個本地JS承諾。我已經精簡了Google Calendar API的JavaScript快速入門代碼,並將它從我的日曆中返回給我一個包含10個對象的數組作爲「事件」。我試圖,在香草JS中,使該API調用一個承諾,然後,當它被解析,做一些與數據(爲簡單起見,我只是想console.log它)。Google日曆API和JS承諾

這是基本的G-Calendar API調用代碼。

var CLIENT_ID = 'SUPER_SECRET_ID_GOES_HERE'; 
var SCOPES = ["https://www.googleapis.com/auth/calendar.readonly"]; 

function checkAuth() { 
    gapi.auth.authorize(
     { 
     'client_id': CLIENT_ID, 
     'scope': SCOPES.join(' '), 
     'immediate': true 
     }, handleAuthResult); 
} 

function handleAuthResult(authResult) { 
    if (authResult && !authResult.error) { 
    loadCalendarApi(); 
    } 
} 

function loadCalendarApi() { 
    gapi.client.load('calendar', 'v3', listUpcomingEvents); 
} 

function listUpcomingEvents() { 
    var request = gapi.client.calendar.events.list({ 
    'calendarId': 'primary', 
    'timeMin': (new Date()).toISOString(), 
    'showDeleted': false, 
    'singleEvents': true, 
    'maxResults': 10, 
    'orderBy': 'startTime' 
    }); 

    request.execute(function(resp) { 
    var events = resp.items; 
    // console.log(events) 
    // return(events) 
    // these are the event objects I want my promise to 
    }) 
} 

現在我知道了一個原生JS承諾的基本結構看起來是這樣的......

function testPromise() { 

    var p1 = new Promise(
    function(resolve, reject) { 
     //Google-Calendar-API-Call Goes Here 
    } 
); 

    p1.then(
    function(val) { 
     console.log(val) 
    }) 
    .catch(
    function(reason) { 
     console.log('Handle rejected promise (' + reason + ') here.'); 
    }); 
} 

我已經打過電話決心(loadCalendarApi)的一些不同的方式和/或解決(listUpcomingEvents),但沒有得到任何東西給控制檯日誌。

我在做什麼錯,我應該如何正確使用Google-Calendar API的承諾?

回答

4
function listUpcomingEvents() { 
    //List upcoming events will return a new Promise 
    return new Promise(function(resolve,reject){ 

    var request = gapi.client.calendar.events.list({ 
     'calendarId': 'primary', 
     'timeMin': (new Date()).toISOString(), 
     'showDeleted': false, 
     'singleEvents': true, 
     'maxResults': 10, 
     'orderBy': 'startTime' 
    }); 

    request.execute(function(resp) { 
     var events = resp.items; 

     //After the request is executed, you will invoke the resolve function with the result as a parameter. 
     resolve(events); 
    }) 
    }); 
} 

當你調用listUpcomingEvents必須返回一個新的承諾,這將代表尚未完成的操作;當您調用解決方案或拒絕時,此操作將完成,並且如果已解決該問題,將繼續執行,然後執行,如果拒絕,則執行執行

調用listUpcompingEvents會是這個樣子:

listUpcomingEvents().then(function(events){ 
    //Whatever goes after 
}).catch(function(err){ 
    //What happens if the promise was rejected 
}); 

希望這有助於:)

+0

嘿劉若英!感謝你的回答。你的代碼幫了我很多。 你寫的承諾完美無缺。爲了使它正常工作,我還必須更改'loadCalendarApi'函數。它目前使用的承諾像這樣:)) 'VAR loadCalendarApi =功能({ gapi.client.load( '日曆', 'V3',功能({ listUpcomingEvents(),然後(函數(事件。 ){ console.log(events) })。catch(function(err){ console.log(「ERROR」,err) }); }); }' – JavaFish