使用Google日历插入事件的承诺

时间:2016-06-15 13:28:47

标签: javascript jquery google-calendar-api

我有一个实现,我从2个函数调用谷歌日历创建事件。每次可能创建多个事件。创建成功事件后,我将返回数据保存在本地数据库中。我面临的问题是在所有事件都可以完成之前,页面重新加载并且大多数事件都无法保存在本地数据库中。我尝试使用$().ajaxStop({});,但也许我做错了所以它不起作用。目前我正在使用$.when但仍然是同样的问题。如何在以下场景中正确实现承诺?任何帮助表示赞赏。

// Google Calendar Insert event start
function handleInsert(id, event){
    var cal_det = JSON.parse(localStorage.getItem('calendarId'));
    var CALENDAR_ID = cal_det.calendar_id;
    var request = gapi.client.calendar.events.insert({
        'calendarId': CALENDAR_ID,
        'resource': event
    });     
    request.execute(function(gres) {
        console.log('Event created: ' + gres.htmlLink);
        // this here is used to update my local database.
        $.getJSON(baseUrl+'<Some URL>', {id: id, value: gres},     function(response){
            console.log(response);
        });
    });
}


// Google calendar insert event end
function syncAppointment(){
    var form = $("#google-sync"); 
    var submiturl = $(form).attr('action'); 
    form.find('.has-error').remove(); 
    $.post( submiturl, form.serialize(), function(response) {
        if(!response.message){
            var j = 0, l = response.length;
            $.each( response, function( key, value ) { 
                 handleInsert(key,value);
                 // this here creates event.
            });
        } else {
            alert(response.message);
        }
    }, "json").done(function() {
        console.log( "Success." );
    }).fail(function() {    
        console.log( "Some error occured. Please try after some time." );
    }).always(function() {  
        console.log( "Completed." );
        window.location.reload();
    });
}


var form = $("#AppointmentAgendaForm"); var submiturl =     $(form).attr('action');
if(validateForm(form) == true){
    $.post( submiturl, form.serialize(), function(response) {
        console.log(response);
        if (!response.error && !response.message && !response.appointments) {
            alert('Nomination (s) a été créé. Nous avons désactivé les créneaux horaires pour les engagements professionnels pour la période de temps définie.');
            $.when.apply($, $.map(response, function( key, value ) {
                handleInsert(value,key);                    
                // this here is second call. this implementation should work but does not...
            })).done(function() { window.location.reload();  /* all ajax calls done now */ });
        } else {
        }
    }, "json").done(function() {
        console.log( "Success." );
        setTimeout(function(){ $(form).find('p.has-error').remove(); }, 3000);
    }).fail(function() {
        console.log( "Some error occured. Please try after some time." );
    }).always(function() {
        console.log( "Completed." );
    });
}

1 个答案:

答案 0 :(得分:0)

请尝试在保存功能中使用Promise.all()。正如文档中所讨论的那样,

  

Promise.all(iterable)方法返回一个promise,它在iterable参数中的所有promise都已解析时解析,或者拒绝第一个传递的拒绝的promise的原因。

此SO帖子中使用了同样的方法 - How to save multiple mongodb collections using Promise。有关如何实现promise.all()的示例代码可以在给定的SO帖子和文档中找到。我希望能解决你的问题。