本人前端萌新,學(xué)習(xí)過一點點Angular,然后自己寫了一個簡單例子,就是顯示一下瀏覽器信息,相關(guān)代碼如下,可以正常運行,界面會先顯示瀏覽器的信息,然后過幾秒顯示出IP地址。
import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import platform from 'platform';
import 'rxjs/add/operator/toPromise';
@Injectable()
export class ClientInfoService {
private static ipUrl = 'http://httpbin.org/ip';
constructor(private httpClient: HttpClient) {
}
getClientInfo(): Promise<ClientInfo[]> {
return new Promise((resolve, reject) => {
const clientInfo: ClientInfo[] = [];
clientInfo.push({key: '操作系統(tǒng)', value: `${platform.os}`});
clientInfo.push({key: '瀏覽器', value: `${platform.name} ${platform.version}`});
clientInfo.push({key: '用戶代理', value: platform.ua});
this.httpClient.get(ClientInfoService.ipUrl)
.subscribe(data => {
clientInfo.push({key: 'IP地址', value: data['origin']});
resolve(clientInfo);
}, err => {
reject(err);
});
});
}
}
export interface ClientInfo {
key: string;
value: string;
}
然后Angular更新到6了,我研究一段時間以后,嘗試升級了一下,好不容易代碼能運行了,但是這下IP地址無法更新了。代碼現(xiàn)在如下,程序其他部分也作了相應(yīng)修改,可以編譯。但是現(xiàn)在程序可以顯示瀏覽器的信息,IP地址永遠為空。我想了想,感覺問題應(yīng)該是出在rxjs這里,因為我對這些概念不太理解,代碼肯定寫錯了,所以希望高手們給我解解惑。感謝各位!
@Injectable()
export class ClientInfoService {
private static ipUrl = 'http://httpbin.org/ip';
constructor(private httpClient: HttpClient) {
}
getClientInfo(): Observable<ClientInfo[]> {
const clientInfo: ClientInfo[] = [];
clientInfo.push({key: '操作系統(tǒng)', value: `${platform.os}`});
clientInfo.push({key: '瀏覽器', value: `${platform.name} ${platform.version}`});
clientInfo.push({key: '用戶代理', value: platform.ua});
const data = this.httpClient.get(ClientInfoService.ipUrl)
.pipe(
catchError(this.handleError('獲取IP地址', '網(wǎng)絡(luò)錯誤'))
);
clientInfo.push({key: 'IP地址', value: data['origin']});
return of(clientInfo);
}
private handleError<T>(operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
console.error(error);
return of(result as T);
};
}
}
export interface ClientInfo {
key: string;
value: string;
}
感謝各位的解答,現(xiàn)在終于可以顯示IP地址了,但是還有一個問題就是原來是立即顯示一些東西,然后獲取到IP地址之后才更新?,F(xiàn)在我這個代碼變成了需要等到IP地址拿到之后才整個顯示數(shù)據(jù)。請問這下應(yīng)該如何處理?
getClientInfo(): Observable<ClientInfo[]> {
const clientInfo: ClientInfo[] = [];
clientInfo.push({key: '操作系統(tǒng)', value: `${platform.os}`});
clientInfo.push({key: '瀏覽器', value: `${platform.name} ${platform.version}`});
clientInfo.push({key: '用戶代理', value: platform.ua});
return this.httpClient.get(ClientInfoService.ipUrl)
.pipe(
map(data => data['origin']),
catchError(this.handleError('獲取IP地址', '網(wǎng)絡(luò)錯誤')),
map(e => {
clientInfo.push({key: 'IP地址', value: e});
return clientInfo;
})
);
}
感覺我描述的不夠清晰,順便補上視圖顯示的代碼。
@Component({
template: `
<mat-table #table [dataSource]="dataSource">
<ng-container matColumnDef="key">
<mat-header-cell *matHeaderCellDef>項目</mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.key}}</mat-cell>
</ng-container>
<ng-container matColumnDef="value">
<mat-header-cell *matHeaderCellDef>值</mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.value}}</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>
`,
})
export class ClientInfoComponent implements OnInit {
dataSource: ClientInfoDataSource;
displayedColumns = ['key', 'value'];
constructor(private clientInfoService: ClientInfoService) {
}
ngOnInit(): void {
this.dataSource = new ClientInfoDataSource(this.clientInfoService);
}
}
class ClientInfoDataSource implements DataSource<any> {
constructor(private clientInfoService: ClientInfoService) {
}
connect(): Observable<ClientInfo[]> {
return this.clientInfoService.getClientInfo();
}
disconnect(): void {
}
}rxjs 需要訂閱,而上面這段代碼中 this.httpClient.get并未subscribe,也就不會觸發(fā),或者即使訂閱了也因為是異步執(zhí)行而沒有效果,最終直接返回了值為clientInfo的observer,這個值始終都會是[]。
正確做法getClientInfo()應(yīng)該返回代碼中定義的data這個Observable,比如說:
getClientInfo(): Observable<ClientInfo[]> {
...
const data = this.httpClient.get(ClientInfoService.ipUrl)
.pipe(
map((rs) => [{key: 'IP地址', value: rs['origin']}]),
catchError(this.handleError('獲取IP地址', '網(wǎng)絡(luò)錯誤'))
);
return data;
}北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。