Javascript: глобальная переменная не работает. (используя SDK.REST.retriveMultipleRecords)

Я не понимаю, почему я не могу повлиять на мою глобальную переменную. Я не понимаю, почему это не работает.. Я считаю, что это связано с SDK.REST.retriveMultipleRecords, но я не понимаю, как. Как вы можете видеть в первом предупреждении, это работает. но во 2-ом это показывает как "неопределенный". В этой скрипте у меня есть простой пример определения глобальной переменной, и она работает.

Кто-нибудь может помочь с этим вопросом? Почему это не влияет на мой globalVar?

Players = new Array(); //GLOBAL VAR

function setPlayers(topNumber){

  SDK.REST.retrieveMultipleRecords(

    "gamify_utilizador",

    "$select=gamify_utilizadorId,gamify_name,gamify_Ranking&$top="+topNumber+"&$orderby=gamify_Ranking asc",

    function (results) {

      if(results.length > 0){
          for(var i = 0;i<results.length;i++){

              Players.push(new Array(results[i].gamify_utilizadorId, results[i].gamify_name));
              alert(Players[i]);  // ALERT OK
          }
      }
      else {
          alert("No Contact records are available to set as the primary contact for the account."); 
      }

    },

    errorHandler,

    function () { 
        //OnComplete handler
    }
  )
  alert(Players[1]); // Alert says "Undefined"

};
document.onreadystatechange = function () {
    if (document.readyState == "complete") {
        setPlayers(4);
       alert(Players[1]);
    }
}

3 ответа

Вместо alert(Players[1]); попробуй это alert(Players[0]);

Думаю, так и должно быть, потому что внутренняя функция еще не была выполнена, и, таким образом, массив все еще не содержит значения в позиции 1, сразу после того, как выполнение и завершение этого массива будет определять это доступное значение

Ваши данные извлекаются асинхронно, поэтому они доступны через некоторое время после выполнения функции setPlayers и, следовательно, через некоторое время после alert(Players[1]) пробеги.

Вот некоторый код, который подтверждает это:

setTimeout(function(){ alert(Players[1]) }, 3000); // check the variable after 3 seconds

Вам необходимо использовать данные после выполнения обработчика успеха (функция, которая заполняет массив Players). Вы можете взглянуть на шаблон Promises, который предлагает более традиционный интерфейс для асинхронного программирования.

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