2

I am running a batch job and I would like them to be run serially for each query result The problem is that it seems that query.each executes everything in parrallel

How can I change my code to have everything execute serially?

Parse.Cloud.job("fetchMenus", function(request, status) {

  var counter = 0;
  // Query for all users
  var LocationSP = Parse.Object.extend("Location");
  var query = new Parse.Query(LocationSP);
  query.doesNotExist("menu");
  query.equalTo("city_lc","new york");
  // query.limit(10);
  var p = Parse.Promise.as("");

  query.each(function(location) {

    p = p.then(function(){

    if (counter % 100 === 0) {
        // Set the  job's progress status
        status.message(counter + " users processed.");
      }
    // console.log(location);
    // console.log(location.get("location_id"));

        Parse.Cloud.run('getMenu2', {alias: location.get("location_id") }, {
          success: function(result) {
            // result is 'Hello world!'
            counter += 1;
            return Parse.Promise.as("1");
          },
          error: function(error) {
            return Parse.Promise.as("1");
          }
        });
    })

    return p;


  }).then(function() {
    // Set the job's success status
    status.success("Migration completed successfully.");
  }, function(error) {
    // Set the job's error status
    status.error("Uh oh, something went wrong." + error);
  });
});
Stephane Maarek
  • 5,202
  • 9
  • 46
  • 87

1 Answers1

2

Both query.each and Parse.Cloud.run return a promise, so you can simply write as following:

Parse.Cloud.job("fetchMenus", function(request, status) {
  var LocationSP, counter, query;
  counter = 0;
  LocationSP = Parse.Object.extend("Location");
  query = new Parse.Query(LocationSP);
  query.doesNotExist("menu");
  query.equalTo("city_lc", "new york");
  return query.each(function(location) {
    if (counter % 100 === 0) {
      status.message(counter + " users processed.");
    }
    return Parse.Cloud.run('getMenu2', {
      alias: location.get("location_id")
    }).then(function(result) {
      counter += 1;
      return Parse.Promise.as("1");
    }, function(error) {
      return Parse.Promise.as("1");
    });
  }).then(function() {
    return status.success("Migration completed successfully.");
  }, function(error) {
    return status.error("Uh oh, something went wrong." + error);
  });
});
eth3lbert
  • 813
  • 5
  • 5
  • thanks!! it's working :) Side question, how can I handle timeouts or how to limit the execution of the Parse Code to 14 minutes to prevent the code to be cut in the middle of the execution when reaching 15 minutes ? – Stephane Maarek Nov 29 '14 at 01:58
  • No problem, I just commit the comment on your new question post. – eth3lbert Nov 29 '14 at 07:57