Javascript - 设置全局变量

时间:2018-01-31 03:34:55

标签: 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);
    }
    );

1 个答案:

答案 0 :(得分:2)

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

在GetUserList函数中,您在注销结果之前显式等待赋值赋值完成,而console.log块中的$(document).ready正在立即执行日志(因为GetUserList不是-blocking)。

尝试注销开发工具中的值,我敢打赌你会看到你期望的东西(假设发生了异步分配)。

或者,您可以使用承诺确保仅在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?