如何解决从forEachloop Javascript中的异步函数返回值
所以我有一个对象内有'n'个元素,我必须进入每个元素内并用另一个函数检查状态,该函数的返回应该给我有多少元素为'true',但在forEach之外循环,问题是一切都在第二个函数的返回内部进行,但外部打印[对象承诺]这是我的代码:
var count=0;
object_x = "relations": [
{
"rel": "System.LinkTypes.Related","url": "545","attributes": {
"isLocked": false,"name": "Related"
}
},{
"rel": "System.LinkTypes.Related","url": "494",{
"rel": "System.LinkTypes.Parent","url": "508","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){
...
解决方法
重要的想法是收集承诺(大概由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",{
"rel": "System.LinkTypes.Parent","url": "508","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)
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。