我在设置全局变量的值时遇到问题。当我的函数 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/