Reputation: 807
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
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
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