Abdul Rafay
Abdul Rafay

Reputation: 807

handle multiple promises in for loop with error handling

i want to handle multiple promises,in example below kouta API returns multiple sites then i want to for loop on sites to get categories one by one.

node code:

request({
        url: 'https://cbatest.kounta.com/v1/companies/20155/sites.json',
        headers: header_data,
        json: requestData,
        method: 'GET',
    }, function (err, response, body) {
        var site_list = body;
        //res.send(site_list);
        var promises = [];
        for (let i = 0; i < site_list.length; i++) {
            var cat_list = new Promise(function (resolve, reject) {
                var site_id = site_list[i].id;
                var category_arr = [];
                request({
                    url: 'https://cbatest.kounta.com/v1/companies/20155/sites/' + site_id + '/categories.json',
                    headers: header_data,
                    json: requestData,
                    method: 'GET',
                }, function (err, response, body) {
                    var category_list = body;
                    resolve(category_list);
                });
            });
            cat_list.then(function (result) {
                promises.push(result);
                console.log(promises);
                res.send(promises)
            }).catch(function (err) {
                console.log(err);
            })
        }
    });

Problem: console.log(promises); only work for last id, and res.send(promises); just work only for 1 time. What i am missing?

Thanks in advance.

Upvotes: 0

Views: 772

Answers (2)

Gilbert lucas
Gilbert lucas

Reputation: 570

Here's simple solution

const companiesPromise = fetch('https://cbatest.kounta.com/v1/companies/20155/sites');
const categoriesPromise = fetch('https://cbatest.kounta.com/v1/companies/20155/sites/categories');

Promise
    .all([companiesPromise,categoriesPromise])
    .then(responses => {
        return Promise.all(responses.map(res => res.json()))
    })
    .then(responses => {
      console.log(responses)
    })
    .catch(err => {
      console.error(error)
    })

Upvotes: 0

Ebrahim Pasbani
Ebrahim Pasbani

Reputation: 9406

Your code send result just for first promise that resolved.

It's better to use from async

And the code becomes like :

request({
        url: 'https://cbatest.kounta.com/v1/companies/20155/sites.json',
        headers: header_data,
        json: requestData,
        method: 'GET',
    }, function (err, response, body) {
        var site_list = body;
        //res.send(site_list);
        var promises = [];

    async.map(site_list, function(site, callback){
                request({
                    url: 'https://cbatest.kounta.com/v1/companies/20155/sites/' + site.id + '/categories.json',
                    headers: header_data,
                    json: requestData,
                    method: 'GET',
                }, function (err, response, body) {
                    var category_list = body;
                    callback(null, category_list);
                });

    }, function(err, result){
        if(err) return res.send(err);

        //result is array of arrays. you can shape it like you want
        res.send(result);
    });

    });

Upvotes: 1

Related Questions