Javascript - 设置全局变量

标签 javascript variables global

我在设置全局变量的值时遇到问题。当我的函数 GetUserList() 被调用时,它在函数内部运行时返回一个 globalUsers 数组。

但是,当我运行该函数后再次登录控制台时,返回的数组为空。我觉得逻辑或者代码执行的方式一定有问题。

我正在寻求在函数中设置 globalUsers 的值,以便将来在脚本的其余部分中使用。

非常感谢您的帮助。请参阅下面的代码:

var globalUsers = [];

function GetUserList(){
    var userList = $().SPServices.SPGetListItemsJson({
                listName: "Users",
                CAMLQuery: "<Query><OrderBy><FieldRef Name='ID' /></OrderBy></Query>",
                async: false,

                mappingOverrides: {
                    ows_Title: {
                        mappedName: "Name",
                        objectType: "Text"
                    },
                    ows_ID: {
                        mappedName: "id",
                        objectType: "Text"
                    },
                    ows_Group: {
                        mappedName: "Group",
                        objectType: "Text"
                    }
                }
            });

            $.when(userList).done(function() {
                thisUserList = this.data;
                globalUsers = thisUserList;
                console.log(globalUsers);
            });
}


    $(document).ready(function () {
        GetUserList();
        console.log(globalUsers);
    }
    );

最佳答案

这是因为你没有等到globalUsers变量已更新。

在 GetUserList 函数中,您在注销结果之前显式等待分配完成,而 console.log在你的$(document).ready block 正在立即执行日志(因为 GetUserList 是非阻塞的)。

尝试在开发工具中注销该值,我打赌您会看到您所期望的内容(假设已发生异步分配)。

或者,您可以使用 promise 来确保您仅在 getUserList 后尝试分配方法已完成:

function GetUserList () {
  return new Promise((resolve, reject) => {
    var userList = $().SPServices.SPGetListItemsJson({
      listName: "Users",
      CAMLQuery: "<Query><OrderBy><FieldRef Name='ID' /></OrderBy></Query>",
      async: false,

      mappingOverrides: {
          ows_Title: {
              mappedName: "Name",
              objectType: "Text"
          },
          ows_ID: {
              mappedName: "id",
              objectType: "Text"
          },
          ows_Group: {
              mappedName: "Group",
              objectType: "Text"
          }
      }
    });

    // Should also handle errors in here somewhere, and reject if they occur...

    $.when(userList).done(function() {
      resolve(this.data);
      console.log('Logging from within getUserList: ', globalUsers);
    });
  })
}


$(document).ready(function () {
  GetUserList().then((userList) => {
    console.log(userList);
    globalUsers = userList; // Global assignment
  })
});

此外,粗略地不要使用全局变量,mmmKay?

关于Javascript - 设置全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48534040/

相关文章:

python-3.x - 尽管 xxx 是全局定义的,但预期的 NameError : name 'xxx' is not defined

memory - CUDA:纹理内存的访问时间是否类似于合并的全局内存?

javascript - grunt-contrib-htmlmin 如何忽略模板标签

javascript - 我可以在 JavaScript 中限制数组的长度吗?

java - 使用变量的值而不是它的名称来声明新变量

C 如何防止随机变量重复相同的数字

javascript - 为什么这个 jQuery 不向下滑动/显示隐藏(向上滑动)的元素?

javascript - 未定义错误: TypeError: Cannot read properties of undefined (reading 'Icon' )

javascript - 非常简单的Javascript。这是什么: "options = options || {};"?

c# - 在 C# 中解决全局热键处理的最佳方法?