Reputation: 827
So I have an object with 'n' elements inside, I have to go inside each element and check the status with another function, the return of that function should give me how many elements are 'true' but outside of the forEach loop, the problem is that everything goes right inside the return of the 2nd function but outside prints [object promise] This is my code:
var count=0;
object_x = "relations": [
{
"rel": "System.LinkTypes.Related",
"url": "545",
"attributes": {
"isLocked": false,
"name": "Related"
}
},
{
"rel": "System.LinkTypes.Related",
"url": "494",
"attributes": {
"isLocked": false,
"name": "Related"
}
},
{
"rel": "System.LinkTypes.Parent",
"url": "508",
"attributes": {
"isLocked": false,
"name": "Parent"
}
}
],
object_x.forEach((element) =>{
var name = element['attributes];
name = name['name];
if(name=='Related'){
let return_of_function_A = function_A(element['url']); //Async function: based on "url" number this function will return true or false
return_of_function_A.then(function(result){
if(result == true){
count++;
}else;
});
}else;
});
console.log(count); //prints [object Promise]
Im not expert on javascript but i think this might be related to the return_of_function_A.then(function(result){
...
Upvotes: 0
Views: 91
Reputation: 62676
The important idea is to collect promises (presumably returned by function_A) then count the true results in all of their resolutions.
let promises = object_x.map(element => A.function_A(element))
// now promises is an array of promises returned by function_A given the parameters in object_x
// create a promise that resolves when all of those promises resolve
// Promise.all() does that, resolving to an array of the resolutions of the passed promises
Promise.all(promises).then(results => {
// results is the array of bools you wish to count
let count = results.filter(a => a).length
console.log(count)
})
Edit - Same idea, using your data.
const function_A = url => {
// simulate an async function on a "url" param
// after a short delay, return true if the int value of url > 500
return new Promise(resolve => {
let large = parseInt(url) > 500
setTimeout(resolve(large), 1000) // delay for 1000ms
})
}
const object_x = {
"relations": [{
"rel": "System.LinkTypes.Related",
"url": "545",
"attributes": {
"isLocked": false,
"name": "Related"
}
},
{
"rel": "System.LinkTypes.Related",
"url": "494",
"attributes": {
"isLocked": false,
"name": "Related"
}
},
{
"rel": "System.LinkTypes.Parent",
"url": "508",
"attributes": {
"isLocked": false,
"name": "Parent"
}
}
]
}
// gather the relations who are "Related"
let relatedRelations = object_x.relations.filter(element => {
return element.attributes.name === "Related"
})
// gather promises for those objects
let promises = relatedRelations.map(element => function_A(element.url))
// now promises is an array of promises returned by function_A given the parameters in object_x
// create a promise that resolves when all of those promises resolve
// Promise.all() does that, resolving to an array of the resolutions of the passed promises
Promise.all(promises).then(results => {
// results is the array of bools you wish to count
let count = results.filter(a => a).length
// expected result : 1.just one of the name === "Related" urls is > 500
console.log(count)
})
Upvotes: 1