我的递归函数不是无限循环。为什么?

时间:2018-03-28 06:17:01

标签: javascript recursion nightmare

噩梦正在发挥作用,当然我正在测试这个工具但是,主要的问题是为什么我的函数不是无限循环?因为我没有成为页面的条件。我可以做错了吗?

我想要的情况是:无论何时加载页面,我都会得到页面,然后再次调用该函数到下一页直到最后一页。

我也没有成功尝试过setTimeout。谁能帮我?谢谢你提前。

我的控制台日志只打印1然后完成。

代码段在这里: -

var pagn = 1;
function ab(page){
    nightmare.goto(url_base+"&page="+page)
             .evaluate(() => {
                return document.title;
            })
            .end()
            .then((title) => {
                console.log(title + ":" + page);
                ab(++pagn);
                //setTimeout("page(" + page + ")", 5000);
            }).catch(()=>{console.log("Error");});
}
ab(pagn);

3 个答案:

答案 0 :(得分:0)

如果nightmare.goto()抛出拒绝怎么办?你应该实现catch() page++没有将递增的值作为其后增量运算符传递。 page + 1++page应该做一些技巧。

var page = 1;
function ab(page){
    nightmare.goto(url_base+"&page="+page)
            .evaluate(() => {
                return document.title;
                    })
            .end()
            .then((title) => {
                console.log(title + ":" + page);
                ab(page+1);
                //setTimeout("page(" + page + ")", 5000);
            }).catch(error => {
                console.error('Search failed:', error)
                ab(page);
            }); 
    }

ab(page);

答案 1 :(得分:0)

在定义全局变量时不应传递页面变量,否则每次都会被覆盖..

var page = 1;
function ab(){
    nightmare.goto(url_base+"&page="+page)
         .evaluate(() => {
            return document.title;
        })
        .end()
        .then((title) => {
            console.log(title + ":" + page);
            ab(page++);
            //setTimeout("page(" + page + ")", 5000);
        }); 
}

ab();

答案 2 :(得分:0)

问题是,您正在使用.end()语句结束会话,该语句会停止恶梦引擎,因此节点在运行剩余的.then语句后退出。

为了测试你的代码,我重写了你的功能,以便它刮擦一个特定的网站,并在它多次找到同一个页面时退出(这是我的测试场景,所以你可能必须为你的代码)

const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })

function scrapePages( targetUrl, curPage = 0, transform = (url, page) => `${url}?page=${page}`, pageSet = new Set() ) {
    console.info('Trying to scrape page ' + transform( targetUrl, curPage ) );
    return nightmare
        .goto( transform( targetUrl, curPage ) )
        .evaluate( () => document.title )
        .then( (title) => {
            if (pageSet.has( title )) {
            throw 'page already exists';
            }
            pageSet.add( title );
            console.info( title + ':' + curPage );
            return scrapePages( targetUrl, curPage + 1, transform, pageSet );
        })
        .catch( ( err ) => {
            console.error( err );
            return { maxPages: curPage, pages: pageSet };
        } );
}

scrapePages( 'some-paged-url', 0, (url, page) => url + '/' + (page + 1) )
    .then( ({ maxPages, pages }) => {
        // end nightmare process
        nightmare.end().then( () => {
            console.info(`Found ${maxPages} pages`);
        });
    } )
    .catch( err => console.error('Error occured', err ) );

正如您所看到的,最大的区别在于噩梦过程的结束仅在刮擦过程中发生。那时,您将拥有可用的总页数和成功调用的所有页面