gpt4 book ai didi

javascript - 该集合尚未在第二次调用 getEnumeration 时初始化

转载 作者:行者123 更新时间:2023-11-30 00:01:20 24 4
gpt4 key购买 nike

我尝试在 SharePoint 中接收用户子网站的子网站。在第一次调用接收子网站(函数 getSubWebs())时,一切正常:子网站已接收,我可以遍历它们。

但是当我尝试使用相同类型的代码获取这些网站的子网站时var webSubEnumerator = subwebCollection.getEnumerator();正在抛出错误

The collection has not been initialized

即使我之前使用过 Load() 并且位于 ExecuteQueryAsync 的“成功”部分(就像在 Web 父请求上一样)。

什么可能导致这里的问题?

var context = SP.ClientContext.get_current();
var user = context.get_web().get_currentUser();
var web = context.get_web();
var lists = web.get_lists();

var parrentwebCollection = null;
ExecuteOrDelayUntilScriptLoaded(getSubWebs, "sp.js");

function getSubWebs(){
parrentwebCollection = web.getSubwebsForCurrentUser(null);
context.load(parrentwebCollection)
context.executeQueryAsync(onGetSubwebsSuccess, onGetSubwebsFail);
}

function onGetSubwebsSuccess(sender, args){
var webEnumerator = parrentwebCollection.getEnumerator();
// Everything works FINE on this getEnumerator()

while (webEnumerator.moveNext()){
var webParrent = webEnumerator.get_current();
var parrenttitel = webParrent.get_title();
var parrenturl = webParrent.get_url();

//Load Subs From Parrent
var subwebCollection = null;
subwebCollection = webParrent.getSubwebsForCurrentUser(null);

if (subwebCollection != undefined && subwebCollection != null) {
context.load(subwebCollection);
context.executeQueryAsync(onGetSSubwebsSuccess, onGetSSubwebsFail);

function onGetSSubwebsSuccess(sender, args) {
console.log("getSubWebs query successful")
var webSubEnumerator = subwebCollection.getEnumerator();
// THIS getEnumerator(), however throws an exception

while (webSubEnumerator.moveNext()){
console.log("After While")
var subweb = webSubEnumerator.get_current();
var subtitel = subweb.get_title();
}
}

function onGetSSubwebsFail(sender, args){
alert("Request to retrieve subwebs failed. Error: " + args.get_message())
}
}
}
}

function onGetSubwebsFail(sender, args){
alert("Request to retrieve subwebs failed. Error: " + args.get_message())
}

请注意,我在 executeQueryAsync() 的 Success() 函数中。 所以我相信 这不是典型的“在异步数据存在之前尝试读取它” - 问题

最佳答案

出现此问题是因为您在 while 循环中多次调用回调函数,并且回调函数从包含范围引用变量 (subwebCollection)——这意味着每次调用该函数访问在包含函数作用域中定义的同一个共享变量(以及同一个共享值)。

(与大多数编程语言不同,JavaScript 是函数作用域而不是 block 作用域。)

您可以通过在 while 循环中使用“闭包”来绕过这个问题,以确保回调函数的每次调用都引用它自己所需变量的本地副本。

function onGetSubwebsSuccess(sender, args) {
var webEnumerator = parentwebCollection.getEnumerator();
while (webEnumerator.moveNext()) {
var webparent = webEnumerator.get_current();
var parenttitle = webparent.get_title();
(function(){ /* anonymous function expression wraps the subwebCollection variable in a closure (creates a new scope for the variable) */
var subwebCollection = null;
subwebCollection = webparent.getSubwebsForCurrentUser(null);
if (subwebCollection != undefined && subwebCollection != null) {
context.load(subwebCollection);
context.executeQueryAsync(onGetSSubwebsSuccess, onGetSSubwebsFail);
function onGetSSubwebsSuccess(sender, args) {
console.log("getSubWebs query successful")
var webSubEnumerator = subwebCollection.getEnumerator();
while (webSubEnumerator.moveNext()) {
console.log("After While")
var subweb = webSubEnumerator.get_current();
var subtitel = subweb.get_title();
}
}
function onGetSSubwebsFail(sender, args) {
alert("Request to retrieve subwebs failed. Error: " + args.get_message())
}
}
})(); /* we immediately invoke the function expression */
}
}

这种技术通常称为立即调用函数表达式或 IIFE。

(function(){
// closure
})();

这不过是一种强制 JavaScript 模仿 block 级作用域而不是函数级变量作用域的方法。

关于javascript - 该集合尚未在第二次调用 getEnumeration 时初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40380314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com