Рекурсия с использованием обещания API

Пожалуйста, найдите код здесь

http://plnkr.co/edit/zwCYGQaxyGyr7kL6fLKh?p=preview

Я пытаюсь выполнить рекурсию с помощью асинхронной функции, которая использует обещание. Я хотел, чтобы это произошло последовательно (поэтому нет $q.all), и хочу дождаться, пока все узлы будут обработаны, прежде чем будет запущен then основного вызова. Другими словами, в конце нужно напечатать You are exited. Как я могу это сделать?

Благодарю.

программа

var asyncPrint = function(val) {
      var deferred = $q.defer();

      $timeout(function() {
        deferred.resolve(console.log(val));
        //console.log(val);
      }, 1000);

      return deferred.promise;
    };


 var tree = {
      1: {node:1, ch: [2,3] },
      2: {node:2, ch: [4] },
      3: {node:3, ch: [] },
      4: {node:4, ch: [5] },
      5: {node:5, ch: [] }
    }

   function recur(tre, node) {
    return Async.asyncPrint(node)
      .then(function () {
        var ch = tre[node.node] ? tre[node.node].ch : []; 
        if(ch.length > 0 ){
            angular.forEach(ch, function (d) {
                return recur(tre, tre[d])
            })
        }
      })
  }

  recur(tree, tree[1]).then(function(){
    console.log('You are exited')
  })

выход

Object {node: 1, ch: Array[2]}
You are exited 
Object {node: 2, ch: Array[1]}
Object {node: 3, ch: Array[0]}
Object {node: 4, ch: Array[1]}
Object {node: 5, ch: Array[0]}

person bsr    schedule 13.02.2014    source источник


Ответы (1)


if(ch.length > 0 ){
    angular.forEach(ch, function (d) {
        return recur(tre, tre[d])
    })
}

Это не работает - здесь вы не возвращаете обещание, когда будете готовы с вызовами recur, а просто возвращаете undefined. Вы действительно хотите использовать all здесь:

return $q.all(ch.map(function(d) {
    return recur(tre, tre[d]);
});

Или для последовательной обработки массива ch:

function next(i) {
    if (i<ch.length)
        return recur(tre, tre[ch[i]]).then(next.bind(null, i+1));
    else
        return i;
}
return next(0);
person Bergi    schedule 13.02.2014
comment
Спасибо. прекрасно работает plnkr.co/edit/zwCYGQaxyGyr7kL6fLKh?p=preview обновлено - person bsr; 13.02.2014