0

我对这个错误或各种解决方案并不陌生,但这个让我摸不着头脑。我正在使用 JavaScript 对象模型来获取给定文件夹中所有文件的所有列表。我在下面的代码中得到关于 getEnumerator 的错误。我已将代码精简到最低限度:

function getFilesInFolder() { 
    var folderServerRelativeUrl = folderPath + ID;
    var context = new SP.ClientContext.get_current();
    var web = context.get_web();
    var list = web.get_lists().getByTitle(documentLibraryName);
    var query = SP.CamlQuery.createAllItemsQuery();
    query.set_folderServerRelativeUrl(folderServerRelativeUrl);

    //Update "web part" link
    $("#doclink").attr('href',folderServerRelativeUrl);
    files = list.getItems(query)
    context.load(files, 'Include(Id)');
    context.executeQueryAsync(Function.createDelegate(this, this.OnSuccess), Function.createDelegate(this, this.OnFailure));
}

function OnSuccess()
{       
//ERROR Next Line:                                   
    var listItemEnumerator = this.files.getEnumerator();
    var table = $("#attachments");


    while (listItemEnumerator.moveNext())  
    {                                    
        console.log("Found a file");
    }                                         
}

代码在文件开头这样调用: $(document).ready(function(){ //Other code... ExecuteorDelayUntilScriptLoaded(getFilesInFolder,"sp.js"); });

我已经尝试了很多变体,并且它曾经可以工作(不确定是什么改变了服务器或客户端)。

4

2 回答 2

1

此错误基本上意味着this.files执行迭代后尚未从服务器请求结果对象(变量)。此错误将通过同时执行多个查询(基本上调用getFilesInFolder多次)来重现。

鉴于结果对象 ( this.files) 存储在全局范围(窗口对象)中,我强烈建议不要使用这种获取列表项的方法,而是可以考虑将结果存储在本地范围中,如下所示:

function getFilesInFolder() { 
    var folderServerRelativeUrl = "/Documents/Archive";
    var context = new SP.ClientContext.get_current();
    var web = context.get_web();
    var list = web.get_lists().getByTitle(documentLibraryName);
    var query = SP.CamlQuery.createAllItemsQuery();
    query.set_folderServerRelativeUrl(folderServerRelativeUrl);
    var items = list.getItems(query)
    context.load(items, 'Include(Id)');
    context.executeQueryAsync(
    function(){
       if(items.get_count() > 0)
       {                                   
           console.log('Found a file(s)');
       }                   
    }, 
    function(sender,args){
        console.log(args.get_message());  
    });
}

使用这种方法,您可以轻松避免与覆盖结果对象的冲突,从而获得此异常。

于 2016-03-16T09:37:06.520 回答
1

我尝试了您的代码,因为我看不到任何明显的错误,并且它有效。我硬编码了folderServerRelativeUrl,因为它在瑞典语中工作:“/sites/intranet/dokument”是我的根网站和“Documents”文件夹。

您可以在浏览器“sitecollection/_api/web/getFolderByServerRelativeUrl('/path/to/folder/')”中尝试查看您使用的网址是否正确。

您还可以在 onsuccess 中设置断点并在控制台中查看:files.get_count() 以查看是否有任何结果。

你的负载很好,所以不要担心!

function getFilesInFolder() { 
        var folderServerRelativeUrl = "/sites/intranet/dokument";
        var context = new SP.ClientContext.get_current();
        var web = context.get_web();
        var list = web.get_lists().getByTitle("Dokument");
        var query = SP.CamlQuery.createAllItemsQuery();
        query.set_folderServerRelativeUrl(folderServerRelativeUrl);

        //Update "web part" link
       // $("#doclink").attr('href',folderServerRelativeUrl);
        files = list.getItems(query)
        context.load(files, 'Include(Id)');
        context.executeQueryAsync(Function.createDelegate(this, this.OnSuccess), Function.createDelegate(this, this.OnFailure));
    }

    function OnSuccess()
    {       
    //ERROR Next Line:                                   
        var listItemEnumerator = this.files.getEnumerator();
        var table = $("#attachments");


        while (listItemEnumerator.moveNext())  
        {                                    
            console.log("Found a file");
        }                                         
    }
于 2016-03-16T06:38:40.293 回答