需要协助在等待Sharepoint列表项删除时延迟javascript。

时间:2014-04-16 13:46:02

标签: javascript sharepoint

我正在尝试自动更新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();
}

1 个答案:

答案 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();

}

我在手机上的内存中键入了这个内容,所以它并不完全正确,但它的结束并且应该给你一般的想法。