【发布时间】:2014-10-23 14:35:46
【问题描述】:
我有一个包含文件夹的列表,我正在尝试获取这些文件夹中文件总数的计数。
我设法检索包含我的文件夹的 ListItemCollection。然后它开始变得……挑剔。
ctx 是我的 ClientContext,collection 我的 ListItemCollection。
function countFiles()
{
var enumCollection = collection.getEnumerator();
while(enumCollection.moveNext())
{
currentItem = enumCollection.get_current();
var folder = currentItem.get_folder();
if (folder === 'undefined')
return;
ctx.load(folder, 'ItemCount');
ctx.executeQueryAsync(Function.createDelegate(this, function()
{
totalCount += folder.get_itemCount();
}), Function.createDelegate(this, onQueryFailed));
}
}
所以它起作用了……一半的时间。如果我的集合中有 6 个项目,我会得到 3 或 4 个“属性或字段 'ItemCount' 尚未初始化”异常,显然我的 totalCount 是错误的。我似乎无法理解为什么,因为 executeQueryAsync 不应该在文件夹实际加载之前发生。
我对 Javascript 很陌生,所以它可能看起来很可怕,并且缺少一些我认为不值得感兴趣的基本代码,请随时询问是否是这样。
【问题讨论】:
-
您遇到了一个非常常见的异步回调和 JavaScript 闭包问题。
-
@Pointy 必须有一些解决方法。我的意思是,我不可能是唯一愿意做这种事的人,对吧?
-
我同意;我不熟悉
.createDelegate()的东西,但我想我知道它的作用。 -
如果这能让你感觉更好,我对这些都不熟悉。我从工作场所的其他 .js 文件中复制了这些,因此它们可能是也可能不是可怕的做法 :)
-
解决这个问题很容易,我怀疑你在回调中引用“文件夹”,但另一个复杂之处是你真的无法知道什么时候总计的过程项目计数完成。这些异步回调将在它们完成时完成,并且最终总数将是正确的。处理起来更复杂。
标签: javascript sharepoint initialization