ForEach元素确实承诺获得最终的总和角度

时间:2018-07-13 15:33:07

标签: angular typescript

我正在尝试使用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是一个弹出窗口)。

2 个答案:

答案 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,正如作者所说: >

  

依次运行任务的功能数组,每个函数将其结果传递给数组中的下一个。