2017-06-09 12 views
0

私は以下のかなり長いjavascriptファイルを持っていますが、ファイル全体、 'totalItemCount'変数、および更新方法を理解することは重要ではありません。このコードでは、Igloo APIを使用してディレクトリ内のファイル数を再帰的にカウントします(カウントはtotalItemCount varに格納されます)。私は前にJavascriptで再帰を使用していないので、私はそこで間違いを犯したかもしれません。何らかの理由でカウントが増加し、後でjavascriptコンソールでダウンしてしまい、その変数をどこかで更新して間違っていると思うようになります(それは数箇所でしか更新されませんが、見つけられません)整数が正しく更新されない

編集:私はそれをより正確に更新しましたが、アイテムはカウントオーバーまたはカウントダウンされて約10%です。私は最後のいくつかのアップデートは問題がどこにあるかもしれないが、私は確信していないと思う。以下のコードは更新されます:

new ApiClient({ 
apimethod: 'objects/7f6d706e-6754-e411-b5b8-d4ae5294c399/children/view', 
method: 'get', 
queryparams: { 
    maxcount: 8000, 
    startindex: 0, 
    includefuturepublished: true 
}, 
onSuccess: function (responseText) 
{ 
    var result = JSON.parse(responseText); 
    var originalObject = result; //first, top-level object 
    var totalItemCount = 0; //UPDATED HERE 

    console.log(result.response); 
    console.log(result.response.items); 
    console.log('RESPONSE TITLE: ' + result.response.items[0].title); 
    console.log("\n\n\n"); 
    totalItemCount += parseInt(result.response.totalCount); //UPDATED HERE 
    console.log("totalItemCount: " + totalItemCount); 

    //Check if object has children and add to totalItemCount accordingly FOR EACH object: 

    function getItemsRecursively(totalItemCount1) 
    { 
     for(var i = 0; i < parseInt(totalItemCount); i++) //at this point, totalCount == #objects at this lvl 
     { 
      console.log("FOR LOOP TEST: " + i); 
      var currentObject = result.response.items[i]; 
      console.log("href/dir: " + currentObject.href); 
      console.log("title: " + currentObject.title); 
      console.log("numchildren: " + currentObject.numchildren); 
      if(currentObject.numchildren > 0 && currentObject.numchildren != undefined) 
      { 
       console.log("it has children..."); 
       getChildrenItemCount(totalItemCount1, currentObject); 
      } 

      console.log("New totalItemCount: " + totalItemCount); 
      console.log("\n~~~~~ NEXT OBJECT ~~~~~\n"); 
     } 
    } 

    function getChildrenItemCount(totalItemCount2, previousObject) 
    { 
     //totalItemCount2 = totalItemCount; 
     var childID = previousObject.id; 
     console.log("childID: " + childID); 
     new ApiClient 
     ({ 
      apimethod: 'objects/' + childID + '/children/view', 
      method: 'get', 
      queryparams: { 
       maxcount: 8000, 
       startindex: 0, 
       includefuturepublished: true 
      }, 
      onSuccess: function (responseText) 
      { 
       console.log("getChildrenItemCount successful..."); 
       var result = JSON.parse(responseText); 
       console.log(result); 
       var currentObject = result.response; 

       var currentFolderItemCount = currentObject.totalCount; 
       console.log("currentFolderItemCount: " + currentFolderItemCount); 

       for(var i = 0; i < parseInt(currentFolderItemCount); i++) //at this point, totalCount == #objects at this lvl 
       { 
        console.log("CHILDREN FOR LOOP TEST: " + i); 
        var currentObject = result.response.items[i]; 
        console.log("href/dir: " + currentObject.href); 
        console.log("title: " + currentObject.title); 
        console.log("numchildren: " + currentObject.numchildren); 
        if(currentObject.numchildren > 0 && currentObject.numchildren != undefined) 
        { 
         console.log("it's children has children..."); 
         totalItemCount += parseInt(currentObject.numchildren); //UPDATED HERE 
         totalItemCount2 = totalItemCount; //UPDATED HERE 
         console.log("totalItemCount after one sub-child total: " + totalItemCount); 
         getChildrenItemCount(totalItemCount2, currentObject); 
        } 

        console.log("New totalItemCount after ENTIRE getChildrenItemCount: " + totalItemCount); 
        console.log("\n~~~~~ NEXT OBJECT WITHIN CHILDREN ~~~~~\n"); 
        console.log("\n\n\n\nFINAL ITEM COUNT: " + totalItemCount); 

       } 
      } 
     }) 
     //return totalItemCount; 
    } 

    getItemsRecursively(totalItemCount); 

    console.log("\n\n\n\nFINAL ITEM COUNT: " + totalItemCount); 
} 

});

+0

関数内でパラメータとしてtotalItemCountを使用していて、公開値として使用しています。私はこれが問題を引き起こしていると思います。関数のパラメータの名前を変更してみてください。 – Sander

答えて

1

"スコープ"の問題​​です。関数のパラメータと同じ変数名を使用して関数を呼び出しているため、パラメータがグローバル変数を上書きします。あなたは、単にVAR関数のパラメータを削除する必要が

var global = 10; 
 

 
function test(global){ 
 
    global += 100; 
 
    console.log(global); 
 
} 
 

 
console.log(global); 
 
test(global); 
 
console.log(global);

は、してください、以下を参照してください。

var global = 10; 
 

 
function test(){ 
 
    global += 100; 
 
    console.log(global); 
 
} 
 

 
console.log(global); 
 
test(global); 
 
console.log(global);

私はさようなら、それは明らかだった願っています。

+0

こんにちは、あなたの助けを借りて、正解でした!関数に渡される変数の名前を変更しました。それはすべてを正確に正確に数えますが、約10%の人数を超えたり、少なすぎたりします...それを引き起こす原因は何ですか?私は私の質問でコードを更新しました – Tom

関連する問題