我如何做一个JavaScript的recursion刮板?

所以我为了学习目的而做一个小刮刀,最后我应该在网站上看到一个树状的页面结构。

我一直在b my我的头,试图正确地得到要求。 这或多或less是我所拥有的:

var request = require('request'); function scanPage(url) { // request the page at given url: request.get(url, function(err, res, body) { var pageObject = {}; /* [... Jquery mumbo-jumbo to 1. Fill the page object with information and 2. Get the links on that page and store them into arrayOfLinks */ var arrayOfLinks = ['url1', 'url2', 'url3']; for (var i = 0; i < arrayOfLinks.length; i++) { pageObj[arrayOfLinks[i]] = scanPage[arrayOfLinks[i]]; } }); return pageObj; } 

我知道这个代码在许多层面上是错误的,但是它应该给你一个我想要做的事情的概念。

我应该如何修改它才能工作? (如果可能,不使用承诺)

(你可以假定网站有一个树形的结构,所以每个页面只有三个页面的链接,所以recursion的方法)

我知道你宁愿不用任何理由承诺(我不能问为什么在评论中,因为我是新的),但我相信承诺是实现这一目标的最好方法。

以下是使用承诺解决您的问题的解决scheme,但可能不是您所需要的:

 var request = require('request'); var Promise = require('bluebird'); var get = Promise.promisify(request.get); var maxConnections = 1; // maximum number of concurrent connections function scanPage(url) { // request the page at given url: return get(url).then((res) => { var body = res.body; /* [... Jquery mumbo-jumbo to 1. Fill the page object with information and 2. Get the links on that page and store them into arrayOfLinks */ var arrayOfLinks = ['url1', 'url2', 'url3']; return Promise.map(arrayOfLinks, scanPage, { concurrency: maxConnections }) .then(results => { var res = {}; for (var i = 0; i < results.length; i++) res[arrayOfLinks[i]] = results[i]; return res; }); }); } scanPage("http://example.com/").then((res) => { // do whatever with res }); 

编辑:感谢Bergi的评论,重写了代码,以避免承诺构造函数反模式。

编辑:重写更好的方法。 通过使用Bluebird的concurrency选项,您可以轻松地限制同时连接的数量。