-1

For some reason on line 54(which is starred out************) an error is popping up saying cannot call 'push' of undefined. My 'randUsers' array which is supposed to initially be empty is not getting passed properly. Why isn't randUsers getting passed properly?

This cloud code on Parse.com is getting triggered by an afterSave function. I declared the variables so they would be global variables, but idk if the fact that this is cloud code and not a regular implementation file affects that.

  var leanBody = "";
  var leanSenderName = "";
  var leanSenderId = "";
  var randUsers = [];

function varReset(leanBody, leanSenderName, leanSenderId, randUsers){
   leanBody = "";
   leanSenderName = "";
   leanSenderId = "";
   randUsers = [];
   console.log("The variables were set");
}


Parse.Cloud.afterSave("Lean", function(request, leanBody, leanSenderName, leanSenderId, randUsers) {
  varReset(leanBody, leanSenderName, leanSenderId, randUsers);

  var leanQuery = new Parse.Query("Lean");
  leanQuery.first({
    success: function(results){
      console.log("The first object was retrieved");
      leanBody = (results.get("messageBody"));
      leanSenderName = (results.get("senderName"));
      leanSenderId = (results.get("senderId"));
      getUsers(leanBody, leanSenderId, leanSenderName, randUsers);
      results.destroy({
        success: function(results){
          console.log("deleted");
        }, error: function(results, error){
        }
      });
    }, error: function(error){
    }

  });
});

  function getUsers(randUsers, response, leanBody, leanSenderName, leanSenderId, randUsers){
    var query = new Parse.Query(Parse.User);
    query.find({
        success: function(results, leanBody, leanSenderName, leanSenderId, randUsers){
            var users = [];
            console.log("results = " + results);
            //extract out user names from results
            for(var i = 0; i < results.length; ++i){
                users.push(results[i].id);
            }
            for(var i = 0; i < 3; ++i){
                var rand = users[Math.floor(Math.random() * users.length)];
                var index = users.indexOf(rand);
                users.splice(index, 1);
                randUsers.push(rand);**********************************************
                }
            console.log("rand = " + rand);
            console.log("The random users are " + randUsers);
            response.success(sendLean(leanBody, leanSenderId, leanSenderName));
        }, error: function(error){
            response.error("Error");
        }
    });
  }

  function sendLean(randUsers, leanBody, leanSenderName, leanSenderId){
    var Mission = Parse.Object.extend("Mission");
    var mission = new Mission();
    for(var i = 0; i < 3; ++i){
      mission.set("messageBody", leanBody);
      mission.set("recipientId", randUsers[i]);
      mission.set("senderName",  leanSenderName);
      mission.set("senderId", leanSenderId);
      mission.save(null, {
        success: function(mission) {
          // Execute any logic that should take place after the object is saved.
          alert('New object created with objectId: ' + mission.id);
        },
        error: function(mission, error) {
          // Execute any logic that should take place if the save fails.
          // error is a Parse.Error with an error code and message.
          alert('Failed to create new object, with error code: ' + error.message);
        }
      });
    }
  }
ian
  • 1,002
  • 2
  • 12
  • 29
  • 1
    Could you try to isolate the problem a little bit more? – rafaelcastrocouto Oct 10 '14 at 18:56
  • Here's your call to `getUsers`: `getUsers(leanBody, leanSenderId, leanSenderName, randUsers);`, here's `getUsers`: `function getUsers(randUsers, response, leanBody, leanSenderName, leanSenderId, randUsers)` notice how a) your parameters don't match and b) you have `randUsers` twice. – Matt Burland Oct 10 '14 at 18:57

1 Answers1

1

You define randUsers locally in the getUsers function by making it an argument:

function getUsers(randUsers, response, leanBody, leanSenderName, leanSenderId, randUsers){
    //blabla
    randUsers.push(rand); //randUsers in this context is the argument passed to the function
    //blabla
}

You call getUsers with these arguments:
getUsers(leanBody, leanSenderId, leanSenderName, randUsers);

so leanBody is randUsers in the getUsers function, you need to either remove it from the arguments or pass it when calling getUsers.

orhanhenrik
  • 1,407
  • 8
  • 11
  • leanBody is randUsers? so it matters in what order i pass the arguments? – ian Oct 10 '14 at 19:08
  • Yes, the names don't matter. The first value you pass will be assigned to the first argument. so randUsers->leanBody, response->leanSenderId, leanBody->leanSenderName, etc.. – orhanhenrik Oct 10 '14 at 19:17