在递归循环中等待运行函数

时间:2012-05-23 18:52:36

标签: jquery sharepoint

我创建了一个递归循环来删除带有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>

1 个答案:

答案 0 :(得分:0)

好的,既然您显示了对looper()的初始调用,那么逻辑似乎没有任何问题。 looper()应该运行8次,直到$intStart等于41.这些是你可能没有像你期望的那样连续运行looper()的原因:

  1. 您收到来自$().SPServices.SPUpdateMultipleListItems()的错误,而completeFunc未按照您的预期执行。
  2. 您的代码中的其他内容正在操纵全局变量$intStart$intCount$intEnd的值,因此它们在您运行时会意外更改,因此循环不会运行尽可能多的迭代次数。
  3. looper()运行期间某处导致javascript异常导致执行停止。
  4. 要对此进行调试,只需在调用console.log()之前添加一个唯一的$().SPServices.SPUpdateMultipleListItems()语句,然后在completeFunc中添加另一个语句,这样您就可以确切地知道它在停止之前的距离。< / p>

    关于代码的其他一些观察:

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

      这对我来说不正确。第一次,你要求处理&gt; 1&amp;&amp; &LT; 10.第二次,你要求处理&gt; 6&amp;&amp; &LT; 15。

      第二次不应该是&gt; 9&amp;&amp; &LT; 18,以获得尚未处理的新的?