w3school - Parse JavaScript SDK y Promise Chaining
promises w3schools (1)
He creado un trabajo en segundo plano en el código Parse Cloud que envía notificaciones por correo electrónico basadas en una fecha en una de mis clases de Parse.
Aquí está la idea: consultar la clase que contiene la fecha. Itera sobre cada objeto devuelto y verifica el campo de fecha. Si la fecha es igual a la de hoy, envíe una notificación por correo electrónico, cambie la fecha a nulo y guárdelo nuevamente en Parse.
Sin embargo, parece que no todos los objetos se guardan de nuevo en Parse. Sospecho que este es un problema con mis cadenas de promesas, pero estoy teniendo dificultades para diagnosticar el problema exacto o cómo solucionarlo. A continuación está el código relevante
Parse.Cloud.job("job", function(request, status) {
// Query for all users
var query = new Parse.Query(className);
query.each(function(object) {
if (condition) {
object.set(key, false);
object.save(null, {
success:function(object){
// This never executes!
},
error: function(error){
}
}).then(function(){
// This never executes
console.log("Save objects successful");
},
function(error){
status.error("Uh oh, something went wrong saving object");
});
// Set hiatus end successful
Mailgun.sendEmail({
});
}
});
});
Esta línea console.log("Save objects successful");
en la cadena de promesas de objects.save () nunca se ejecuta, incluso cuando el objeto de suscripción se guarda correctamente en Parse.
Además, si hay más de 5 objetos devueltos por la consulta, solo los primeros 5 se guardan de nuevo en Parse. Los guardados adicionales no se ejecutan y las notificaciones por correo electrónico no se envían.
Lo limpiaría de la siguiente manera, confiando en Promise.when ...
var savePromises = []; // this will collect save promises
var emailPromises = []; // this will collect email promises
// your code to setup the query here
// notice that this uses find() here, not each()
query.find(function(subscriptions) {
_.each(subscriptions, function(subscription) { // or a for loop, if you don''t use underscore
// modify each subscription, then
savePromises.push(subscription.save());
// prepare each email then
var emailPromise = Mailgun.sendEmail({ /* your email params object here */ });
emailPromises.push(emailPromise);
});
// now do the saves
return Parse.Promise.when(savePromises);
}).then(function() {
// now do the emails
return Parse.Promise.when(emailPromises);
}).then(function() {
// Set the job''s success status
status.success("Subscriptions successfully fetched");
// and so on with your code
También podría considerar combinar los resguardos y los correos electrónicos en una gran variedad de promesas, pero podría ser mejor hacerlo en dos lotes en serie ya que tienen diferentes modos de falla.