0

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){ ...

4
  • Something is not right about your code. While you say that a.function_A should return true or false, the code then treats it as a promise. Is it supposed to be a promise that's resolved to either true or false? In that case, you have a race condition on count. Commented Aug 15, 2020 at 18:52
  • Can you please edit your question so that it includes a mcve? Commented Aug 15, 2020 at 18:54
  • @IvanRubinson I just updated, it is a promise Commented Aug 15, 2020 at 19:15
  • Where are you using async/await? Commented Aug 15, 2020 at 20:00

1 Answer 1

1

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)
})

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.