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
,因为它根据您的代码返回的内容并不重要,因为它没有被使用。
也许那么,最好让承诺做的工作。我会建议在这种情况下,这个重构:
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;
})
它更直观一点,它实际上利用承诺的好处。但是,最终取决于你。
感谢您的回应!我会考虑重构。我认为还有一个时间问题。如果两个控制器几乎同时需要这些数据,则可能已经创建了HTTP请求,但data1和data2尚未定义,并且执行将进入_else _块。我仍然看到我的代码发出2个HTTP请求。 – lemontree
对,你应该和我原来的想法一致。这实际上更好,因为它没有'$ q'。概念是,我们只运行一次HTTP方法,并且将承诺存储在一个变量中,然后所有将来的调用都会使用它。运行'this.dataPromise = null'的''clearData'函数可能会很好,因为您希望再次从HTTP调用中获取新数据。 – aaronofleonard
谢谢 - 这个伎俩。我只需要在ui-router的状态改变时重置dataPromise为null,以便data1和data2中的数据不会过时。 – lemontree