所以我有一个里面有'n'个元素的对象,我必须进入每个元素内部,并用另一个函数检查状态,该函数的返回应该告诉我有多少元素是'true',但在forEach循环之外,问题是所有东西都在第二个函数的返回内部,但在外部打印[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)
})