-1

我创建了一个递归循环来使用 SPServices 删除 SharePoint 列表中的项目。我设置了 5 秒的超时时间;但是由于某种原因,它一次只删除 2 个项目,然后执行等待而不是删除批处理,然后重复该功能。

请在下面找到我的代码:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery.SPServices/0.7.1a/jquery.SPServices-0.7.1a.min.js"></script>
<script type="text/javascript">

    $(document).ready(function () {
        $intStart = 1;
        $intCount = 10;
        $intEnd = 40;

        $("input[class='buttonpush']").click(function () {
            var looper = function () {
                if ($intStart < $intCount && $intStart < $intEnd) {
                    $().SPServices.SPUpdateMultipleListItems({
                        webURL: "http://widgettest",
                        listName: "TestList",
                        CAMLQuery: "<Query><Where><And><Gt><FieldRef Name='ID' /><Value Type='Counter'>" + $intStart + "</Value></Gt><Lt><FieldRef Name='ID' /><Value Type='Counter'>" + $intCount + "</Value></Lt></And></Where></Query>",
                        batchCmd: "Delete",
                        valuepairs: [],
                        debug: false,
                        completefunc: function (xData, Status) {
                            $intStart = $intStart + 5;
                            $intCount = $intCount + 5
                            setTimeout(looper, 5000);
                        }
                    });
                }
                else { 
                }
            }
            looper();
        });
    });

</script>
4

1 回答 1

0

好的,现在您显示了对 的初始调用looper(),逻辑似乎没有任何问题。 looper()应该运行 8 次,直到$intStart等于 41。这些是您可能无法获得预期的 looper() 连续运行次数的原因:

  1. 你得到一个错误$().SPServices.SPUpdateMultipleListItems()并且completeFunc没有像你期望的那样被执行。
  2. 您的代码中的其他内容正在操作全局变量的值$intStart$intCount或者$intEnd它们在您运行时意外更改,因此循环不会像预期的那样运行尽可能多的迭代。
  3. 在运行过程中,您会在某处得到一个 javascript 异常,looper()这会导致执行停止。

要对此进行调试,只需在调用之前放置一个独特的console.log()语句,然后在调用之前放置另一个语句$().SPServices.SPUpdateMultipleListItems()completeFunc这样您就可以准确地知道它在停止之前已经走了多远。

对代码的其他一些观察:

  1. $intStart总是小于,$intCount因为它开始较少并且两者都增加 5,所以你不需要if语句的那部分。
  2. $除非您暗示某种特殊类型的变量,否则不习惯在 javascript 变量前面加上符号。这不是这里的情况,只是阻碍了熟悉 javascript 的人对 javascript 的可读性。
  3. 您的变量$intStart$intCount或者$intEnd可能不应该是全局变量,并且在所有情况下都不应隐式声明或意外声明全局变量。如果您的意思是让它们成为全局变量,则使用 . 将它们声明为全局范围内的全局变量var。如果您的意思是让它们在某个范围内是本地的,那么在该范围内声明它们。
  4. 因为您的变量是全局变量并且一次只初始化一个document.ready(),所以您的按钮只能在第一次工作。第二次推送时它永远不会做任何事情。
  5. 您的代码在运行时不受用户再次按下按钮的保护looper()(这将导致启动重复请求)。

这是您的 CAMLQuery 前两次的内容:

<Query>
    <Where>
        <And>
            <Gt>
                <FieldRef Name='ID' />
                <Value Type='Counter'>1</Value>
            </Gt>
            <Lt>
                <FieldRef Name='ID' />
                <Value Type='Counter'>10</Value>
            </Lt>
        </And>
    </Where>
</Query>"    

<Query>
    <Where>
        <And>
            <Gt>
                <FieldRef Name='ID' />
                <Value Type='Counter'>6</Value>
            </Gt>
            <Lt>
                <FieldRef Name='ID' />
                <Value Type='Counter'>15</Value>
            </Lt>
        </And>
    </Where>
</Query>"    

这对我来说看起来不正确。第一次,您要求处理 > 1 && < 10。第二次,您要求处理 > 6 && < 15。

第二次不应该是 > 9 && < 18 以获得尚未处理的新的吗?

于 2012-05-23T20:46:29.787 回答