JSOM dynamicly get two announcements from all lists in all webs

大兔子大兔子 提交于 2019-12-24 12:09:12

问题


Need help with the chaining. The functions work. But async calls make it hard for me to get everything. Help me think right! My thought:

  1. Get All Webs recursively (function works)

  2. Get all lists from webs and iff announcementlist add to array and pass along

  3. Get two items from all announcmentlists and sort by created.

  4. Add ALL announcement items into one large array (to be able to sort array later.

Heres the code,

function getAllWebs(success, error) {
    var ctx = SP.ClientContext.get_current();
    var web = ctx.get_site().get_rootWeb();
    var result = [];
    var level = 0;
    result.push(web);
    var getAllWebsInner = function (web, result, success, error) {
        level++;
        var ctx = web.get_context();
        var webs = web.get_webs();
        ctx.load(webs, 'Include(Title,Webs,ServerRelativeUrl)');
        ctx.executeQueryAsync(
          function () {
              for (var i = 0; i < webs.get_count() ; i++) {
                  var web = webs.getItemAtIndex(i);
                  result.push(web);
                  if (web.get_webs().get_count() > 0) {
                      getAllWebsInner(web, result, success, error);
                  }
              }
              level--;
              if (level == 0 && success)

                  success(result);
          },
          error);
    };

    getAllWebsInner(web, result, success, error);

}

function error(sender, args) {

    console.log(args.get_message());
};


function getAnnouncementLists(web, success, error) {
    var dfd = $.Deferred();
    var ctx = web.get_context();
    var collList = web.get_lists();
    var result = []
    ctx.load(collList, 'Include(Title, Id, BaseTemplate)');
    ctx.executeQueryAsync(function () {
        for (var i = 0; i < collList.get_count() ; i++) {
            var list = collList.getItemAtIndex(i);
            var bTemp = list.get_baseTemplate();
            if (bTemp == 104) {
                result.push(list);
            }
        }
        //success(result);
        dfd.resolve(result);
    }, error);
    return dfd.promise();
}

function getListItems(list, success, error) {

    var dfd = $.Deferred();
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml('<View><Query><OrderBy><FieldRef Name="Created" Ascending="False"></FieldRef>'
        + '</OrderBy></Query><ViewFields><FieldRef Name="Title"/><FieldRef Name="Body"/>' +
        '<FieldRef Name="Created"/></ViewFields><RowLimit>2</RowLimit></View>');
    var listItems = list.getItems(camlQuery);
    var result = []
    var ctx = list.get_parentWeb().get_context();
    ctx.load(listItems);
    ctx.executeQueryAsync(function () {
        for (var i = 0; i < listItems.get_count() ; i++) {
            var item = listItems.getItemAtIndex(i);
            result.push(item);

        }
        dfd.resolve(result);
        //success(result);
    }, error);
    return dfd.promise();
}

function printResults(items) {

    var sortedItems = items.sort(dynamicSort("get_created()"));


    alert(sortedItems);
}

function dynamicSort(property) {
    var sortOrder = 1;
    if (property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a, b) {
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

$(document).ready(function () {

var items = getAllWebs(
   function (allwebs) {
       var array = [];
       for (var i = 0; i < allwebs.length; i++) {
           getAnnouncementLists(allwebs[i]).then(function (announceLists) {
               for (var i = 0; i < announceLists.length; i++) {
                   getListItems(announceLists[i]).then(function (items) {
                       array.push(items);

                   });

               }
           });
       }


       return array;
   }
   );





//getAllWebs(
//    function (allwebs) {
//        for (var i = 0; i < allwebs.length; i++) {
//            getAnnouncementLists(allwebs[i],
//                function (announceLists) {
//                    for (var i = 0; i < announceLists.length; i++) {
//                        getListItems(announceLists[i],
//                            function (items) {
//                                printResults(items);


//                            }, error);
//                    }

//                }, error);
//        }
//    }, error);



});

回答1:


Given the requirements to retrieve list items from Announcements lists located across site collection, below is demonstrated the modified example that contains some improvements such as:

  • the number of requests to the server is reduced
  • fixed the issue in getAllWebs function that prevents to return any results if site contains only a root web

Example

function getAllWebs(propertiesToRetrieve,success, error) {
    var ctx = SP.ClientContext.get_current();
    var web = ctx.get_site().get_rootWeb();
    var result = [];
    var level = 0;
    ctx.load(web, propertiesToRetrieve);
    result.push(web);
    var getAllWebsInner = function (web, result, success, error) {
        level++;
        var ctx = web.get_context();
        var webs = web.get_webs();
        var includeExpr = 'Include(Webs,' + propertiesToRetrieve.join(',') + ')';
        ctx.load(webs, includeExpr);
        ctx.executeQueryAsync(
          function () {
              for (var i = 0; i < webs.get_count() ; i++) {
                  var web = webs.getItemAtIndex(i);
                  result.push(web);
                  if (web.get_webs().get_count() > 0) {
                      getAllWebsInner(web, result, success, error);
                  }
              }
              level--;
              if (level == 0 && success)
                  success(result);
          },
          error);
    };
    getAllWebsInner(web, result, success, error);
}



function loadListItems(lists,query,success,error,results){
    var results = results || [];
    var curList = lists[0];
    var ctx = curList.get_context();
    var listItems = curList.getItems(query);
    ctx.load(listItems);
    ctx.executeQueryAsync(function () {
        results.push.apply(results, listItems.get_data());
        lists.shift();
        if(lists.length > 0) {
            loadListItems(lists,query,success,error,results);
        }
        if(lists.length == 0)
           success(results);
    }, error);
}


function dynamicSort(property) {
    var sortOrder = 1;
    if (property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a, b) {
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}


var propertiesToRetrieve = ['Lists.Include(BaseTemplate)','ServerRelativeUrl'];
getAllWebs(propertiesToRetrieve,
function(allwebs){

    //1. get filtered lists
    var allAnnouncementLists = [];
    allwebs.forEach(function(w){
        var announcementLists = w.get_lists().get_data().filter(function(l){
            if(l.get_baseTemplate() == SP.ListTemplateType.announcements)
               return l;
        });
        allAnnouncementLists.push.apply(allAnnouncementLists, announcementLists);
    });



    //2.Load list items from lists
    var query = new SP.CamlQuery();  //<-set your custom query here
    loadListItems(allAnnouncementLists,query,
        function(allListItems){            
            //3.Sort and print results
           var sortedItems = allListItems.sort(dynamicSort("get_created()"));
           sortedItems.forEach(function(item){
              console.log(item.get_item('Title')); 
           });
        },logError);
},
logError);



function logError(sender,args){
    console.log(args.get_message());
}


来源:https://stackoverflow.com/questions/34945251/jsom-dynamicly-get-two-announcements-from-all-lists-in-all-webs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!