2016-03-22 21 views
1

Bir denetleyici çağırmadan önce özyinelemeli bir veri yapısını çözmek istiyorum, ancak bunu nasıl yapacağım ile uğraşıyorum.Özyinelemeli bir veri yapısı için bir vaat

benim geçerli kod şöyle görünür:

region.loadChildren = function() { 
    region.children = []; 
    return region.resource.all('children').getList().then(function(subs) { 
     angular.forEach(subs, function(sub) { 
      sub.loadChildren(); 
      region.children.push(sub); 
     }); 
     }, errorCallback 
    ); 
}; 

ben bir şekilde sub.loadChildren tarafından döndürülen sözler() "toplamak" ve bunları birleştirebilirsiniz?

cevap

1

$ q.all youre çözümdür vaatlerin biriktirileceği ilk diziyi yaratan ve daha sonra asıl işlevin özgün işlevini değiştirilmiş bir sürümüne ileten:

region.loadChildren = function() { 
    var tmp = []; 
    this.loadChildrenHelper(tmp); 
    this.children = tmp; 
} 

region.loadChildrenHelper = function(accum) { 
    return region.resource.all('children').getList().then(function(subs) { 
     angular.forEach(subs, function(sub) { 
      sub.loadChildrenHelper(accum); 
      accum.push(sub); 
     }); 
     }, errorCallback 
    ); 
}; 

ardından söz koleksiyonları pekiştirmek çıkan dizinin

2

Evet, bu sözleri, listedeki her sözün ne zaman çözüldüğünü çözen tek bir sözde toplamak için $q.all'u kullanabilirsiniz.

region.loadChildren = function() { 
    region.children = []; 
    return region.resource.all('children').getList().then(function(subs) { 
     var promises = subs.map(subs, function(sub) { 
      var promise = sub.loadChildren(); 
      region.children.push(sub); 
      return promise; 
     }); 

     var allPromisesInOnePromise = $q.all(promises); // a regular promise which will resolve when all of the promises will resolve 

     }, errorCallback 
    ); 
}; 

burada-https://docs.angularjs.org/api/ng/service/$q

0

Sen ile mevcut fonksiyonunu yerine burada vaatler ve $ q.all işlevi hakkında daha fazla bilgi edinebilirsiniz -

var promises = [] 
angular.forEach(subs, function(sub) { 
    promises.push(sub.loadChildren()); 
    region.children.push(sub); 
}); 
$q.all(promises).then(function(values) { 
    // Finished 
}) 
1

Kullanım $q.all üzerinde $q.all kullanıp zincirleme için dönüş onlara emin olun. bir söz .then yöntemi çağıran yeni türetilmiş söz verdiği için

region.loadChildren = function() { 
    //return for chaining 
    return region.resource.all('children').getList().then(function(subs) { 
     var children = []; 
     angular.forEach(subs, function(sub) { 
      var p = sub.loadChildren(); 
      children.push(p); 
     }); 
     //return for chaining 
     return $q.all(children); 
    ); 
}; 

, vaat bir zincir oluşturmak üzere kolaylıkla mümkündür. Herhangi bir uzunluktaki zincirler oluşturmak mümkündür ve bir söz başka bir söz ile çözülebileceğinden (bunun çözümünü daha fazla erteleyecek), söz konusu sözlerin çözümünü zincirdeki herhangi bir noktada duraklatmak/ertelemek mümkündür. Bu, güçlü API'lerin uygulanmasını mümkün kılar. $q.alldeğil esnek olduğunu 1

fazla bilgi için,

AngularJS $q service API Reference -- chaining promises. unutmayın bakın. Sözlerden biri reddedilirse, $q.all ilk hatayla reddedilir.