我正在尝试使用Facebook的GRAPH API设置喜欢人数的计数器。 我有一个对象ID的列表,对于earch ID,我使用api调用来获取该对象的喜欢程度,然后设置一个总和。
但是此调用返回一个Promise,并且当我使用foreach时,即使我的列表中有多个元素,也只会重拨一个调用。
我该怎么做才能得到这个总和? 这是我的代码。
countLike(data : any[]){
let counter : number = 0;
data.forEach(element => {
this.debogger.debogSomething("Reached : " + element as string);
this.facebook.api("/"+ (element as string) +"?fields=likes", ["public_profile","user_posts"]).then((response) => {
counter += response.likes.data.length as number;
this.debogger.debogSomething(counter);
}).catch((err) => {
this.debogger.debogSomething(err);
});
});
}
这是我在stackoverflow中的第一篇文章! 非常感谢 !
** [编辑]新代码,仍然无法使用**
countLike(){
Promise.all(this.objectIdsToFilter.map((value) => {
return this.facebook.api(value+"?fields=likes", ["public_profile","user_posts"])
}))
.then((response) => {
this.debogger.debogSomething(response)
})
.catch(err=>{
this.debogger.debogSomething(err);
})
}
在输入中,一个数组包含3个值(2个有效值,1个无效值)。 输出:什么也没发生(奇怪的是,debogger是一个弹出窗口)。
答案 0 :(得分:0)
您可能可以执行以下操作:-
countLike(data: any[]) {
let counter: number = 0;
Promise.all(data.map(element) => {
this.debogger.debogSomething("Reached : " + element as string);
this.facebook.api("/" + (element as string) + "?fields=likes", ["public_profile", "user_posts"])
}).then((response) => {
counter = response.reduce((sum, res) => {
sum += res.likes.data.length ;
}, 0);
this.debogger.debogSomething(counter);
}).catch((err) => {
this.debogger.debogSomething(err);
});
}
答案 1 :(得分:0)
如果您对诺言的概念感到困难,也可以使用新的async await
方法(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function)。
还有一个async
模块(https://caolan.github.io/async/docs.html),您可以在js中使用它,它具有多种方法,例如waterfall
,正如作者所说: >
依次运行任务的功能数组,每个函数将其结果传递给数组中的下一个。