Javascript:全局变量不起作用。 (使用SDK.REST.retriveMultipleRecords)

时间:2014-02-26 11:59:06

标签: javascript sdk global-variables

我不明白为什么我不能影响我的全局变量。我不明白为什么这不起作用..我相信它与SDK.REST.retriveMultipleRecords有关,但我不明白如何。正如您在第一个警报中看到的那样,它可以工但在第二场,它显示为“未定义”。 在这个fiddle中,我有一个关于定义全局变量的简单示例,它可以工作。

任何人都可以帮忙解决这个问题吗?为什么它不影响我的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 个答案:

答案 0 :(得分:0)

而不是alert(Players[1]);尝试此alert(Players[0]);

答案 1 :(得分:0)

您的数据是异步检索的,所以它在执行setPlayers函数后的某个时间可用,因此在alert(Players[1])运行后的某个时间可用。

以下是一些验证它的代码:

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

您需要在成功处理程序(填充Players数组的函数)执行后使用数据。您可以查看Promises模式,该模式为异步编程提供了更传统的接口。

答案 2 :(得分:0)

认为它应该是因为内部函数尚未执行,因此数组在第1位仍然不包含任何值,只是在执行并完成此数组后将重置此值