这是我的代码:
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
答案 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
}
);