我正在尝试自动更新SharePoint 2010中的8个区域列表。该过程包括1)从spreadhseet发布所有8个区域的主列表,2)删除8个区域列表中的所有列表项,3)复制区域从主列表到特定区域列表的特定项目。当单独执行时,该过程的每个组件都可以完美地工作。现在,我只是尝试将步骤放入循环中以自动处理所有8个区域的所有三个步骤。
其中一个主要问题是,一旦我提交删除区域1中的列表项的请求,我就无法复制新内容,直到删除它完成。当然,我的sript表示已经完成,但它所做的只是将请求提交给SharePoint。 SharePoint可能需要15秒到1分钟才能实际删除列表项。
因此,一旦我提交了删除,我就会进入另一个查询Region 1列表大小的循环。一旦确认列表为零项目,我想继续复制。现在,“查询大小”循环炸弹有不同的错误,如“列表不存在”等。这是我的代码的提取,相关部分。如果有人有修复/改进的建议,我会非常欢迎这些反馈。
//Loop through X (8) regions and delete all list items from 'Inventory Region X' List
function main() {
for (var i=1;i<9;i++)
{
alert("Enter Delete Loop " + i);
listname = "Inventory Region " + i;
// Submit the delete request
deletetheregionitems(i);
// Wait for the delete to complete
controllistcount = null;
alert("Begin delay cycle.");
while (controllistcount != 0)
{
countoflistitems(listname);
}
controllistcount = null;
alert("Exit loop!");
}
alert("All Region Lists should now be empty.");
}
function countoflistitems(listname) {
// Get the count of items in the requested list
var clientContext = new SP.ClientContext.get_current();
oList = clientContext.get_web().get_lists().getByTitle(listname);
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><Query><Where><Geq><FieldRef Name=\'ID\'/><Value Type=\'Number\'>1</Value></Geq></Where></Query></View>');
this.listItems = oList.getItems(camlQuery);
clientContext.load(listItems, 'Include(Id)');
clientContext.executeQueryAsync(Function.createDelegate(this, this.countretrieveSucceeded), Function.createDelegate(this, this.queryFailed));
}
function countretrieveSucceeded(sender, args) {
controllistcount = listItems.get_count();
}
答案 0 :(得分:0)
使用Promises暂停,直到删除回调结算,然后再添加新的。不要反复轮询服务器。伪代码:
deleteItems().then(){
addNewItems();
}
function deleteItems(){
var dfd=jQuery.deferred;
[JSOM code to delete items]
executeQueryAsync(function(){
dfd.resolve();
}, null);
return dfd.promise();
}
我在手机上的内存中键入了这个内容,所以它并不完全正确,但它的结束并且应该给你一般的想法。