方法中的javascript变量在方法外使用

时间:2014-03-31 16:11:19

标签: javascript

这是我的代码:

var count = 0;

function retrieveCurrentListProperties() {
    clientContext = new SP.ClientContext.get_current();
    web = clientContext.get_web();
    var list = web.get_lists().getByTitle("Urgent Alerts");
    var camlQuery = new SP.CamlQuery();
    var q =  "<View><Query><Where><Eq><FieldRef Name='End_x0020_Date'/><Value Type='DateTime'><Today/></Value></Eq></Where></Query></View>";
    camlQuery.set_viewXml(q);
    this.listItems = list.getItems(camlQuery);
    clientContext.load(this.listItems);
    clientContext.executeQueryAsync(Function.createDelegate(this, this.onCListItemsLoadSuccess), 
    Function.createDelegate(this, this.onQueryFailed));

}

function onCListItemsLoadSuccess(sender, args) {

    var count1 = 0;
    var listEnumerator = this.listItems.getEnumerator();
    //iterate though all of the items

count1 = this.listItems.get_count();


}




function onQueryFailed(sender, args) {
    alert('request failed ' + args.get_message() + '\n' + args.get_stackTrace());
}



                count = 1;

此代码从sharepoint检索列表,然后计算该列表中的项目数。我需要在count1的另一个部分中使用count=1,但显然如果我count=count1它会抛出错误。 我怎样才能以我想要的方式使用count1

1 个答案:

答案 0 :(得分:1)

由于SP.ClientContext.executeQueryAsync method在服务器上执行当前待处理请求异步,因此通常使用两种方法来控制SharePoint中异步调用的顺序执行。

  • 回调
  • 延迟

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

function getData(Success,Error) {
   //...
   clientContext.executeQueryAsync(function() {
             var result = ...
             Success(result);
           },
           Error
    );
} 

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

回调方法示例

function getItemsCount(listTitle,Success,Error) {
    var clientContext = new SP.ClientContext.get_current();
    var web = clientContext.get_web();
    var list = web.get_lists().getByTitle(listTitle);
    var qry = SP.CamlQuery.createAllItemsQuery();
    var listItems = list.getItems(qry);
    clientContext.load(listItems);
    clientContext.executeQueryAsync(function() {
         var count = listItems.get_count();
         Success(count);
       },
       Error
    );
}


//Usage
getItemsCount('Tasks', function(tasksCount){
    //...
    console.log('Tasks count:' + tasksCount);
   },
   function(sender, args) {
    console.log('Error:' + args.get_message());
   }
);

推荐

避免全局变量

将代码包装在作用域函数中,并使用该作用域函数的本地变量,并使其他函数在其中闭包

(function() { // Begin scoping function
    var clientContext; // Global to your code, invisible outside the scoping function
    function loadListItems(listTitle) {
        // ...
    }
})();    

Function.createDelegate的用法

在大多数情况下,不需要使用Function.createDelegate包装处理程序,而是可以写:

ctx.executeQueryAsync(succeeded,failed);

ctx.executeQueryAsync(function(){
    //...
  },
  function(sender,args){
    //Error handling goes here
  }
);