w3schools w3school then promises for ejemplo dummies all javascript parse.com promise cloud-code

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.