Christopher Martinez
Christopher Martinez

Reputation: 827

Return value from async function inside forEachloop Javascript

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

Answers (1)

danh
danh

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

Related Questions