我遇到了设置全局变量值的问题。调用我的函数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);
}
);
答案 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?