简体   繁体   中英

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM