2016-03-28 8 views
0

Wie kann ich verschachtelte context.executeQueryAsync mit Deferred verwenden? Unten ist mein Code, und ich werde erklären, was genau ich suche:Verschachtelte context.executeQueryAsync mit verzögerter

-Code

function getValues() { 
    var dfd = $.Deferred(function() { 

     context.executeQueryAsync(function() { 
      var navigationItem = []; 

      // First Loop 
      while (termEnumerator.moveNext()) { 

       // Push Parent Terms in navigationItem array 
       navigationItem.push({ "name": ""}); 

       // Get Sub Terms 
       context.executeQueryAsync(function() { 
        // Second Loop 
        while (termsEnum.moveNext()) { 
         // Push Sub Terms in navigationItem array 
         navigationItem.push({ "name": ""}); 
        } 
       }, function (sender, args) { 
        console.log(args.get_message()); 
       }); 
      } 

      dfd.resolve(navigationItem); 

     }, function (sender, args) { 
      console.log(args.get_message()); 
      dfd.reject(args.get_message()); 
     }); 
    }); 
    return dfd.promise(); 
} 

Grundsätzlich versuche ich Taxonomy (AGB & es Unter Begriffe) in Sharepoint Online mit über Codestruktur zu holen . Anfangs habe ich ein Array mit dem Namen navigationItem erstellt und durch alle Begriffe iteriert.

Während der Iteration, dränge ich zuerst Ausdrücke in dieses Array und zusammen damit, bekomme ich auch seine Unterbegriffe, wenn überhaupt, und schiebe es in das gleiche Array.

Ich möchte, dass dieser Code nicht weiter ausgeführt wird, bis die zweite Schleife die Ausführung beendet. Damit werde ich das letzte Array haben und es zu einer anderen Funktion zurückbringen.

Antwort

1

Ich möchte, dass dieser Code nicht weiter ausgeführt wird, bis die zweite Schleife es ist die Ausführung abgeschlossen ist. So dass ich letzte Array haben werde, während es eine andere Funktion zurückgibt.

In diesem Fall müssen Sie für jedes executeQueryAsync eine Verzögerung festlegen.

Dann müssen Sie eine Gesamtverzögerung erstellen, um zu warten, bis alle asynchronen Methoden abgeschlossen sind.

Hier ist der Beispielcode für Ihre Referenz:

(function ($) { 
    function executeQueryAsync(succeededCallback, failedCallback) 
    { 
     var period = Math.random() * 10000; 

     setTimeout(function() { 
      succeededCallback(); 
     }, period); 

    } 

    function forEachAsync(items, funcAsync, callback) 
    { 
     var count = 0; 

     var total = $.Deferred(); 

     function increment() 
     { 
      count++; 

      if(count == items.length) 
      { 
       total.resolve(); 
      } 
     } 

     for (var i = 0; i < items.length; i++) 
     { 
      (function exec(item) { 
       var deferred = $.Deferred(function (defer) { 
        funcAsync(function() { 
         callback(); 
         defer.resolve(); 
        }); 
       }); 

       deferred.done(function() { 
        increment(); 
       }); 
      })(items[i]); 
     } 

     return total.promise(); 
    } 

    var promise = forEachAsync([1, 2, 3, 4, 5], executeQueryAsync, function() { 
     console.log('call back executing + ' + Date.now()); 
    }); 

    promise.done(function() { 
     console.log("promise done"); 
    }); 
})(jQuery); 

enter image description here

Verwandte Themen