【问题标题】:Need assistance delaying javascript while waiting for Sharepoint list item deletion.在等待 Sharepoint 列表项删除时需要帮助延迟 javascript。
【发布时间】:2014-04-16 13:46:02
【问题描述】:

我正在尝试自动更新 SharePoint 2010 中的 8 个区域列表。该过程包括 1) 从电子表格发布所有 8 个区域的主列表,2) 删除 8 个区域列表中的所有列表项,3) 复制区域从主列表中的特定项目到特定区域列表。当单独执行时,该过程的每个组件都可以完美运行。现在,我只是尝试将这些步骤放入循环中,以自动处理所有 8 个区域的所有三个步骤。

其中一个主要问题是,一旦我提交了从区域 1 中删除列表项的请求,在删除完成之前我无法复制新内容。当然,我的 sript 说它已经完成,但它所做的只是将请求提交到 SharePoint。 SharePoint 可能需要 15 秒到 1 分钟才能真正删除列表项。

所以,一旦我提交删除,我就会进入另一个循环来查询区域 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();
}

【问题讨论】:

  • 你可以考虑使用工人
  • 我对sharepoint一点经验都没有,如果你能从js方面解释一下问题,我也许可以提供帮助。
  • 感谢 ProllyGeek。基本上,其中一个功能是对 Web 服务器进行外部调用,要求它执行任务。完成后服务器不会响应我,所以我需要循环一个额外的请求来亲自​​查看它是否完成。一旦我知道它已经完成,我想继​​续我的脚本。
  • 好吧,很高兴知道,那么您必须检查自己的问题(需要自动回复)吗?或者你不能检查自己
  • 服务器基本上是从表中删除项目,我需要等到它们都被删除后再将新记录复制到其中。所以我向服务器发送一个请求,询问表中当前有多少项目。一旦服务器返回 0,我就可以继续前进。所以我循环查询服务器,直到我得到 0 然后我退出循环并继续复制。似乎直到我离开循环,服务器才开始删除。希望这是有道理的。

标签: javascript sharepoint


【解决方案1】:

使用 Promises 暂停,直到删除回调解决,然后再添加新的。不要重复轮询服务器。伪代码:

deleteItems().then(){
    addNewItems();

}

function deleteItems(){
    var dfd=jQuery.deferred;
    [JSOM code to delete items]
    executeQueryAsync(function(){
        dfd.resolve();
    }, null);
    return dfd.promise();

}

我是在手机上从记忆中输入的,所以这并不完全正确,但它很接近,应该给你一个大致的想法。

【讨论】:

  • 谢谢!我将不得不阅读承诺。下周我会试试这个。谢谢你的好主意!
  • 听起来是个好主意。但是我的客户使用的是 IE,这个浏览器不支持 Promise。不过,感谢您的教育。
  • 没有任何版本的 IE 原生支持 Promises,但是如果你在 JQuery 之类的库中使用 Promises 的实现,那么它们在 IE 中可以正常工作
  • 优秀的大卫!谢谢!
猜你喜欢
  • 2019-08-23
  • 2011-10-25
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多