所以我有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被定义。我怎样才能做到这一点?
答案 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.data1
和this.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;
})
它更直观,它实际上利用了承诺的好处。但是,最终它取决于你。