forEachloop Javascript中异步函数的返回值

forEachloop Javascript中异步函数的返回值,javascript,asynchronous,foreach,async-await,Javascript,Asynchronous,Foreach,Async Await,所以我有一个里面有'n'个元素的对象,我必须进入每个元素,用另一个函数检查状态,该函数的返回应该告诉我有多少元素是'true',但在forEach循环之外,问题是所有东西都在第二个函数的返回里面,但在打印之外[object promise]这是我的代码: var计数=0; object_x=“relations”:[ { “rel”:“System.LinkTypes.Related”, “url”:“545”, “属性”:{ “isLocked”:false, “名称”:“相关” } }, {

所以我有一个里面有'n'个元素的对象,我必须进入每个元素,用另一个函数检查状态,该函数的返回应该告诉我有多少元素是'true',但在forEach循环之外,问题是所有东西都在第二个函数的返回里面,但在打印之外[object promise]这是我的代码:

var计数=0;
object_x=“relations”:[
{
“rel”:“System.LinkTypes.Related”,
“url”:“545”,
“属性”:{
“isLocked”:false,
“名称”:“相关”
}
},
{
“rel”:“System.LinkTypes.Related”,
“url”:“494”,
“属性”:{
“isLocked”:false,
“名称”:“相关”
}
},
{
“rel”:“System.LinkTypes.Parent”,
“url”:“508”,
“属性”:{
“isLocked”:false,
“名称”:“父项”
}
}
],
对象x.forEach((元素)=>{
变量名称=元素['attributes];
名称=名称['name];
如果(名称==‘相关’){
让我们返回函数的_\u A=函数_A(元素['url']);//异步函数:根据“url”编号,此函数将返回true或false
返回函数的值,然后(函数(结果){
如果(结果==真){
计数++;
}否则;
}); 
}否则;
});
控制台日志(计数)//打印[对象承诺]

我不是javascript方面的专家,但我认为这可能与函数A的
返回有关。然后(函数(结果){
..

重要的想法是收集承诺(可能由函数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函数\u A=url=>{
//在“url”参数上模拟异步函数
//短暂延迟后,如果url的int值>500,则返回true
返回新承诺(解决=>{
设large=parseInt(url)>500
setTimeout(解析(大),1000)//延迟1000ms
})
}
常量对象_x={
“关系”:[{
“rel”:“System.LinkTypes.Related”,
“url”:“545”,
“属性”:{
“isLocked”:false,
“名称”:“相关”
}
},
{
“rel”:“System.LinkTypes.Related”,
“url”:“494”,
“属性”:{
“isLocked”:false,
“名称”:“相关”
}
},
{
“rel”:“System.LinkTypes.Parent”,
“url”:“508”,
“属性”:{
“isLocked”:false,
“名称”:“父项”
}
}
]
}
//收集“相关”的关系
让relatedRelations=object\u x.relations.filter(元素=>{
return element.attributes.name==“相关”
})
//为这些目标收集承诺
让promises=relatedRelations.map(element=>function\u A(element.url))
//现在promises是给定对象x中参数的函数A返回的承诺数组
//创建一个承诺,当所有这些承诺都解决时,该承诺就会解决
//all()执行此操作,解析为已传递承诺的一系列解析
承诺。所有(承诺)。然后(结果=>{
//结果是您希望计数的布尔数组
让count=results.filter(a=>a).length
//预期结果:1.名称==“相关”URL中只有一个>500
console.log(计数)

})
你的代码有点不对劲。当你说
a.function\u a
应该返回true或false时,代码会将其视为一个承诺。它应该是一个被解析为true或false的承诺吗?在这种情况下,你在
count
上有一个竞态条件。你能编辑你的问题,使它包含一个?@IvanRubinson I刚刚更新,这是一个承诺,您在哪里使用
async
/
wait