首页 > 解决方案 > ForEach 元素确实承诺得到最终的总和

问题描述

我正在尝试使用 facebook 的 GRAPH API 设置点赞计数器。我有一个对象 ID 列表,对于每个 ID,我使用 api 调用来获取这个对象有多少喜欢,然后设置一个总和。

但是这个调用返回了一个承诺,当我使用 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 个无效)。输出:没有任何反应(奇怪的是,调试器是一个弹出窗口)。

标签: angulartypescript

解决方案


您可能可以执行以下操作:-

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

}

推荐阅读