2个控制器依赖于工厂内的HTTP请求

时间:2016-10-21 19:39:01

标签: javascript angularjs angular-promise

所以我有2个控制器依赖于工厂内部功能提取的数据。工厂看起来像这样:

factory.getData = function() {
   const req = {...};
   return $http(req).then((res) => {
       this.data1 = res.data.response[0];
       this.data2 = res.data.response[1];
       return res;
})

然后在我的控制器中:

this.factory.getData().then((data) => {
    this.controllerData1 = this.factory.data1;
    this.controllerData2 = this.factory.data2;
})

注意:我省略了实际的工厂名称。 这可以获得我需要的数据,但是两个控制器都会触发http请求,这显然不是理想的。所以我需要第二个控制器等到data1和data2被定义。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

factory.dataPromise = null;

factory.getData = function() {
   if (this.dataPromise !== null) {
      return this.dataPromise;
   }
   else {
       const req = {...};
       return this.dataPromise = $http(req).then((res) => {
           this.data1 = res.data.response[0];
           this.data2 = res.data.response[1];
           return res;
       })
   }
}

这有点粗糙,但应该能够在这里找到工作,虽然老实说我会建议稍微重构代码。但我想尽可能少地重构这个答案。

关键是始终返回承诺。只要你这样做,你就没事。如果我们检查this.data1this.data2是否已经可用,我们可以返回一个立即解决的承诺,而无需再进行另一次HTTP调用。

哦,如果它不清楚,你需要包括$q(或用你想要的任何其他Promise库替换它),以便能够明白地创建承诺。

要考虑:不是严重的问题,但是当您致电factory.getData()时,您实际上并未使用由承诺。这就是为什么在我的回答中,我只有一个变量whateverdata,因为根据您的代码返回的内容并不重要,因为它不会被使用。<\ n / p>

也许那时,让承诺完成工作会更好。在这种情况下我会建议这个重构:

factory.dataPromise = null;

factory.getData = function() {
   if (this.dataPromise !== null) {
      return this.dataPromise;
   }
   else {
       const req = {...};
       return this.dataPromise = $http(req).then((res) => {
           this.data1 = res.data.response[0];
           this.data2 = res.data.response[1];
           return { data1: this.data1, data2: this.data2 };
       })
   }
}

this.factory.getData().then((data) => {
    this.controllerData1 = data.data1;
    this.controllerData2 = data.data2;
})

它更直观,它实际上利用了承诺的好处。但是,最终它取决于你。