在Angular4.x中使用Rxjs請求數(shù)據(jù),發(fā)現(xiàn)多次請求會造成n+1次請求次數(shù),極大地影響性能,目前只能采用最笨拙的依次聲明對應Subscription對象一一手動取消訂閱,感覺不是正常辦法,想請教更好的解決方式,示例代碼如下:
service:
getRuleHitList(): any {
const formData = {
'uuid': this.orderNo
};
this.$http
.post(this.HOST.host + '/api/bqsBlackList', formData)
.subscribe(res => {
console.log(res);
this.RuleHitSubject.next(res);
})
}
component:
ruleSubscription: Subscription;
getRule() {
this.service.getRuleHitList();
this.ruleSubscription = this.service.RuleHitSubject.subscribe(res => {
if (res && res.code === '0') {
if (res.strategySet || res.Rule) {
this.ruleListFlag = true;
this.ruleList = res;
}
} else {
this.ruleListFlag = false;
}
this.ruleSubscription.unsubscribe()
})
上述getRule會在當前頁面多次用到,且component不會銷毀,因此不加unsubscribe()手動取消訂閱頁面會越來越卡,總感覺自己用的不對,請大佬不吝賜教;
你這么做就復雜了啊。。。
你首先在component一個調(diào)用service中的getHttpRuleList()方法來發(fā)一個http請求,然后訂閱了這個請求的結果,并將這個結果傳遞給了RuleHitSubject, 又在component中來訂閱這個RuleHitSubject,來拿到http返回的結果, 是不是有點多此一舉了呢?
首先,http請求可以不用直接就訂閱的,我們可以直接返回這個observable。
然后在component中直接訂閱這個observable, 將component中的訂閱作為一個流的終點。
所以你的代碼可以改成這樣:
service:
getRuleHitList(): Observable<any> {
const formData = {
'uuid': this.orderNo
};
return this.$http.post(this.HOST.host + '/api/bqsBlackList', formData)
}
component:
ruleSubscription: Subscription = null;
getRule() {
if (this.ruleSubscription === null) {
this.ruleSubscription = this.service.getRuleHitList().subscribe(res => {
if (res && res.code === '0') {
if (res.strategySet || res.Rule) {
this.ruleListFlag = true;
this.ruleList = res;
}
} else {
this.ruleListFlag = false;
}
});
}
而針對訂閱,通常都要在組件銷毀的時候來取消訂閱,以防訂閱的引用在應用中越來越多。
ngOnDestroy() {
if (this.ruleSubscription) {
this.ruleSubscription.unsubscribe();
}
}getRuleHitList(): any {
const formData = {
'uuid': this.orderNo
};
return this.$http
.post(this.HOST.host + '/api/bqsBlackList', formData);
}
ruleSubscription: Subscription;
getRule() {
this.service.getRuleHitList().subscribe(res => {
if (res && res.code === '0') {
if (res.strategySet || res.Rule) {
this.ruleListFlag = true;
this.ruleList = res;
}
} else {
this.ruleListFlag = false;
}
});
}北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。