-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()41に等しくなるまで8回実行する必要$intStartがあります。これらは、期待するほど多くの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()一度に1つしか初期化されないため、ボタンを押すと最初にのみ機能します。もう一度押すと何もしません。
  5. コードは、実行中にユーザーがボタンをもう一度押すことから保護されていませんlooper()(これにより、重複するリクエストが起動されます)。

CAMLQueryが最初の2回になるのは次のとおりです。

<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回目は、> 1 && <10を処理するように要求しています。2回目は、> 6&&<15を処理するように要求しています。

まだ処理されていない新しいものを取得するために、2回目は> 9 && <18であるべきではありませんか?

于 2012-05-23T20:46:29.787 に答える