Parse JavaScript SDK y Promise Chaining

He creado un trabajo en segundo plano en Parse Cloud Code 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. Iterar sobre cada objeto devuelto y comprobar 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 nula y guárdela en Parse.

Sin embargo, parece que no todos los objetos se guardan de nuevo en Parse. Sospecho que esto es un problema con mis cadenas de promesa, pero me está costando mucho diagnosticar el problema exacto o cómo solucionarlo. A continuación se muestra 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 promesa objects.save () nunca se ejecuta, incluso cuando el objeto de suscripción se guarda correctamente en Parse.

Además, si la consulta devuelve más de 5 objetos, solo los primeros 5 se guardan con éxito en Parse. Cualquier guardado adicional no se ejecuta 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 guardados 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.

Intereting Posts