2017-06-02 15 views
0

私はこれを行うためにさまざまな方法を試しました。
以下のコードのように、私は.eachの反復が完了した後にコードを実行しようとしました。各ループが完了した後に実行するコード

function test(){ 
    var iterate = $.each(ohrArray, function(i, val){ 

     var ohrID = ohrArray[i]; 
     var folderUrl = 'EFMSEmployeeDocumentList' + "/" + locationFolder; 
     var url = _spPageContextInfo.webServerRelativeUrl + "/_api/Web/GetFolderByServerRelativeUrl('" + folderUrl + "')?$expand=Files"; 

     $.getJSON(url,function(data,status,xhr){ 

     for(var i = 0; i < data.Files.length;i++){ 
      modifiedDate= new Date(data.Files[i].TimeLastModified); 
      if(documentTitle == ""){ 
      showData(ohrID ,data.Files[i].Title,data.Files[i].ServerRelativeUrl,modifiedDate); 
      countItems++; 
      }else{ 
      if(documentTitle == data.Files[i].Title) 

       countItems++; 
       showData(ohrID ,data.Files[i].Title,data.Files[i].ServerRelativeUrl,modifiedDate); 
      } 
     } 
     } 
    }).complete(function(){ 

     $('#tblCustomListData').dataTable({ 
     paging: true, 
     searching: true, 
     bDestroy: true, 
     "iDisplayLength": 5, 
     "lengthMenu": [5,10, 25, 50, 100] 
     }); 
     if(countItems == 0){ 
     alert("No Files Exists"); 
     $("#divCustomListData").hide(); 
     } 
    }); 
    } 
}); 


    $.when(iterate) 
    .then(function(iterate){ 
    if(countItems == 0){ 
     alert("No Files Exists"); 
    } 
    }); 
} 

はまだデバッグ中に私は.eachが完了する前に.thenのコードが実行されていることを参照してください。

他に何ができますか?

答えて

0

私は、そうでなければ、私はあなたがAPIにfolderURLのリストを与えることができますので、あなたのAPIを変更すべきだと思うのdataTable here

$(document).ready(function() { 
    $('#example').DataTable({ 
     "ajax": "data/objects.txt", 
     "columns": [ 
      { "data": "name" }, 
      { "data": "position" }, 
      { "data": "office" }, 
      { "data": "extn" }, 
      { "data": "start_date" }, 
      { "data": "salary" } 
     ] 
    }); 
}); 

から解決策を見つけました。
その後、.each()のすべてのループでリクエストを送信する必要はありません。
さらに使用すると、1つのsuccessコールバックでdataTableを作成することができるはずとだけgetJSON

+0

2番目の 'getJSON'リクエストが最初の' getJSON'リクエストより速い応答を送ることができるので、 – KumarV

0

あなたは$.each内XMLHTTPRequeatを行いますので、私はあなたがすべての要求が処理されるとき、いくつかのコードを実行するとします。 JSは性質上非同期であるため、これは直接発生しません。

処理される要求の合計を記録するために、いくつかのカウンタ変数を保持することができます。このような何か:

var iterate = $.each(ohrArray, function(i, val) { 

     var url = "......"; 
     var counter = 0; 
     $.getJSON(url, function(data, status, xhr) { 

     counter++; 
     /**** Rest of the code ****/ 

     if (counter == ohrArray.length) { 
      // Execute the required code by pasting it here or calling a function. 
     } 

     }); 

    } 
+0

というfolderURLのリストをどのように渡すのがもう1つの問題です。私はこの方法でこれをしたいと思うならば、同期していないajax呼び出しを作らなければならないと思います。 – UfguFugullu

+0

カウンタ変数をインクリメントしているのでこれはうまく動作しません。また、 'ohrArray'の長さと同じですすべてのリクエストが正常に返されます。 – void

+0

申し訳ありませんが、私の頭の中にオーバーフローがあります。あなたは正しい - これは動作します – UfguFugullu

2

iterateプロミスでなければなりません。

$.when()をPromiseでないものに渡すと、デフォルトでは既に解決済みのものになりますので、すぐに$.then()が実行されます。

$.Deferred

はその後、再び、あなたはそれぞれのAJAX呼び出しが応答したときにのみ更新されますcountItemsをチェックしているチェックのjQueryでの約束を使用します。あなたが本当に必要とするのは、.complete()を完全に捨てて、約束の配列です。 .eachの各反復では配列内に新しいPromiseが作成され、次に$.when()を使用してすべての約束が解決されたかどうかを確認します。

function test(){ 
    var promises = []; // 

    $.each(ohrArray, function(i, val){ 
     var d = $.Deferred(); // keep the reference to the promise 
     promises.push(d); // push the promise into the array 

     var ohrID = ohrArray[i]; 
     var folderUrl = 'EFMSEmployeeDocumentList' + "/" + locationFolder; 
     var url = _spPageContextInfo.webServerRelativeUrl + "/_api/Web/GetFolderByServerRelativeUrl('" + folderUrl + "')?$expand=Files"; 

     $.getJSON(url,function(data,status,xhr){ 

     for(var i = 0; i < data.Files.length;i++){ 
      modifiedDate= new Date(data.Files[i].TimeLastModified); 
      if(documentTitle == ""){ 
      showData(ohrID ,data.Files[i].Title,data.Files[i].ServerRelativeUrl,modifiedDate); 
      countItems++; 
      }else{ 
      if(documentTitle == data.Files[i].Title) 

       countItems++; 
       showData(ohrID ,data.Files[i].Title,data.Files[i].ServerRelativeUrl,modifiedDate); 
      } 
     } // end of for loop 
     d.resolve(); // the ajax in this iteration has been resolved 
     } 
    }); 

    // $.when doesn't accept array of promises by default 
    $.when.apply(this, promises).then(function(){ 
     // now all the promises have been resolved 

     // code inside the .complete you had in your question 
     $('#tblCustomListData').dataTable({ 
     paging: true, 
     searching: true, 
     bDestroy: true, 
     "iDisplayLength": 5, 
     "lengthMenu": [5,10, 25, 50, 100] 
     }); 
     if(countItems == 0){ 
     alert("No Files Exists"); 
     $("#divCustomListData").hide(); 
     } 

     iterate.resolve(); 
    }); 
    } 
}); 


} 

コードを実行していないため、角かっこが間違って書式設定されているか間違っている可能性があります。

+0

のコードに到達していない場合nullの場合、locationFolderがnullでないという条件を持っていますなぜ 'iterate.resolve();' ajax呼び出しの完全な機能です。コード実行は、ほとんどの場合、そこに到達しないことがあります。各ループが完了する直前にはできません。 – KumarV

+0

私のせいで、コードをajaxの補完で実行したいと思っていました。私は自分の答えを編集しますが、その前に、明確にすることを求めましょう。 '.each'のすべての反復が完了した後、または' .each() 'ステートメントの直後にコードを実行しますか? '.each'の中の関数は非同期に呼び出され、' .each() 'の後のステートメントはイテレーションが終了する前にただちに呼び出されるので、私は尋ねています。 – vassiliskrikonis

+0

各ループが完了した後でコードを実行したい場合 – KumarV

関連する問題