2015-06-06 7 views
0

Я пытаюсь найти базовый веб-искатель. Стек отслеживает все URL-адреса для посещения в будущем.Как вызвать эту функцию рекурсивно?

До тех пор, пока стек не станет пустым, вы хотите получить список всех hrefs, используемых на веб-странице. Пытались использовать arguments.calee но он возвращает: (! Или любой Promise цепи, на самом деле)

RangeError: Maximum call stack size exceeded

JavaScript

"checkStack": function(test) { 
    //check if the stack is empty 
    if (!stack.isEmpty()) { 
     var newAddress = stack.pop(); 
     console.log("trying to navigate to: ", newAddress); 
     return test.remote.get(newAddress) 
      .setFindTimeout(240000) 
      //.sleep(4000) 
      .findAllByTagName("a") 
      .getAttribute("href") 
      .then(function(hrefs) { 
       console.log("got hrefs: " + hrefs.length); 
       assert.isArray(hrefs, 'Links not an array'); 
       checkAddressValidity(hrefs, 0); 
      }) 
      .then(function() { 
       //call checkStack recursively 
       checkStack(test); 
      }.bind(test)); 

    } 
}, 
... 
+0

Это выглядит странно для меня: 'функцию() {checkStack (тест); } .bind (тест) '. Кажется, вы привязываетесь к аргументу функций? Может быть, вы должны привязаться к области, где вместо этого находится «checkStack». Может быть, более полный пример. –

ответ

1

Простой способ выполнения рекурсии в командной цепи держать ваши стек в закрытии, затем вызовите метод, который выполняет работу рекурсивно, как обратный вызов Promise, пока ваш стек не будет исчерпан. После того, как стопка будет решена undefined будет возвращено next вместо другого обещания, которое сигнализирует конец рекурсии:

checkStack: function (test) { 
    var remote = test.remote; 
    var stack = []; 

    function next() { 
    var newAddress = stack.pop(); 
    if (newAddress) { 
     return remote.get(newAddress) 
     .findAllByTagName('a') 
     .getAttribute('href') 
     .then(function (hrefs) { 
      // do whatever 
     }) 
     .then(next); 
    } 
    } 

    return next(); 
} 
+0

Спасибо C Snover. Это помогло .. – user2325313