我有一个实现,我从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." );
});
}
答案 0 :(得分:0)
请尝试在保存功能中使用Promise.all()。正如文档中所讨论的那样,
Promise.all(iterable)方法返回一个promise,它在iterable参数中的所有promise都已解析时解析,或者拒绝第一个传递的拒绝的promise的原因。
此SO帖子中使用了同样的方法 - How to save multiple mongodb collections using Promise。有关如何实现promise.all()
的示例代码可以在给定的SO帖子和文档中找到。我希望能解决你的问题。