Search code examples
javascriptrecursionpromisees6-promise

How to return promise up the chain after recursion


I am making a request which returns paged data, so I want to call a function recursively until I have all of the pages of data, like so:

router.get("/", (req, res) => {
    doRequest(1, [])
        .then(result => {
            res.status(200).send(result);
        })
        .catch(error => {
            console.error(error);
            res.status(500).send("Error from request");
        });
});

function doRequest(page, list){
    let options = {
        uri : "www.example.com",
        qs : { "page" : page }
    };
    request(options)
        .then((results) => {
            list.push(results);
            if(page === 2){
                return Promise.resolve(list);
            } else {
                return doRequest(++page, list);
            }
        })
        .catch((error) => {
            return Promise.reject(error);
        });
}

My route is returning immediately with Cannot read property 'then' of undefined, so doRequest() is apparently returning undefined right away, rather than returning the list when it is ready. I'm new to promises so I'm sure I'm missing something pretty simple.


Solution

  • Change the doRequest function to

    function doRequest(page, list){
        let options = {
            uri : "www.example.com",
            qs : { "page" : page }
        };
        return request(options)
            .then((results) => {
                list.push(results);
                if(page === 2){
                    return Promise.resolve(list);
                } else {
                    return doRequest(++page, list);
                }
            })
            .catch((error) => {
                return Promise.reject(error);
            });
    }
    

    so it can return the request, its actually returns nothing (undefined)