繁体   English   中英

来自 forEachloop Javascript 内的异步 function 的返回值

[英]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问题是一切都在第二个 function 的返回内进行,但在外部打印 [object promise] 这是我的代码:

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] 

我不是 javascript 方面的专家,但我认为这可能与return_of_function_A.then(function(result){ ...

重要的想法是收集 Promise(可能由 function_A 返回),然后计算所有解决方案中的真实结果。

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

编辑 - 相同的想法,使用您的数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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