如何在SharePoint客户端对象模型中使用回调函数?

时间:2014-08-07 14:50:08

标签: jquery sharepoint sharepoint-2013

SharePoint 2013:我只有在使用客户端对象模型REST API执行我的方法时才需要调用我的方法。见下面的例子:

              <script type="text/javascript">
                function getListData() {
                    context = new SP.ClientContext.get_current();
                    web = context.get_web();
                    var list = web.get_lists().getByTitle('myList');
                    var myquery = new SP.CamlQuery();
                    myquery.set_viewXml("<View><Query><Where><IsNotNull><FieldRef Name='Title' />" +
                "</IsNotNull></Where></Query></View>");
                   myItems = list.getItems(myquery);
                    context.load(myItems);
                    context.executeQueryAsync(Function.createDelegate(this, function () { getListDataSuccess(); }), Function.createDelegate(this, this.getListDataFailed));
                }
                $(document).ready(function () {
                    getListData();
                    // I need to call my method here.
                    //Once getListDataSuccess method is completed then only I need to call some other function based on the result of getListDataSuccess method.
                });
            </script>

我可以在getListDataSuccess中调用我的方法,但这不是这里的情况。排队的其他几种方法一个接一个地使用客户端对象模型REST API。因此只剩下回调选项。 JQuery和SPServices中提供了类似的回调功能。但不确定它如何与SharePoint客户端对象模型一起使用?

1 个答案:

答案 0 :(得分:3)

由于JSOM是异步,因此通常使用两种方法来控制SharePoint中异步调用的顺序执行:

  • 回调
  • 延迟

回调方法

使用回调方法,您可以像这样声明您的函数

function getListData(listTitle,success,error)
{
    var context = SP.ClientContext.get_current();
    var web = context.get_web();
    var list = web.get_lists().getByTitle(listTitle);
    var items = list.getItems(SP.CamlQuery.createAllItemsQuery());

    context.load(items);
    context.executeQueryAsync(
        function() {
          success(items);           
        },
        error
    );
}

用法

getListData('Documents',
         function(items){
            console.log('Items count: ' + items.get_count());
         },
         function(sender,args){
            console.log('An error occured while retrieving list items:' + args.get_message());
});

延迟方法

延迟方法基于Promises模式,请参阅this article以获取有关使用CSOM的Promises的使用的详细信息

  

延迟 - 是一种立即从中返回对象的模式   异步调用

function getListData(listTitle,success,error)
{
    var dfd = $.Deferred(function () {
      var context = SP.ClientContext.get_current();
      var web = context.get_web();
      var list = web.get_lists().getByTitle(listTitle);
      var items = list.getItems(SP.CamlQuery.createAllItemsQuery());

      context.load(items);
      context.executeQueryAsync(
        function() {
           dfd.resolve(items);           
        },
        function (sender, args) {
           dfd.reject(args);
        }
      );
    });
    return dfd.promise();   
}

用法

getListData('Documents').then(function(items){
    console.log('Items count: ' + items.get_count());
});