Переменные javascript не передаются в функцию

По какой-то причине в строке 54(которая помечена звездочкой ************) появляется сообщение о том, что нельзя вызвать push из undefined. Мой массив randUsers, который изначально должен быть пустым, не передается должным образом. Почему randUsers не проходит должным образом?

Этот облачный код на Parse.com запускается функцией afterSave. Я объявил переменные, чтобы они были глобальными переменными, но не стоит, если на это влияет тот факт, что это облачный код, а не обычный файл реализации.

  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);
        }
      });
    }
  }

1 ответ

Решение

Вы определяете randUsers локально в функции getUsers, делая ее аргументом:

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

Вы вызываете getUsers с этими аргументами:
getUsers(leanBody, leanSenderId, leanSenderName, randUsers);

поэтому leanBody в функции getUsers является randUsers, вам нужно либо удалить его из аргументов, либо передать его при вызове getUsers.

Другие вопросы по тегам