Angular2:将数组转换为 Observable
Angular2: convert array to Observable
我有一个通过 http 从服务获取数据的组件,问题是我不想每次显示该组件时都访问 API 后端。我希望我的服务检查数据是否在内存中,如果是,return 一个可观察到的数组在内存中,如果不是,则发出 http 请求。
我的组件
import {Component, OnInit } from 'angular2/core';
import {Router} from 'angular2/router';
import {Contact} from './contact';
import {ContactService} from './contact.service';
@Component({
selector: 'contacts',
templateUrl: 'app/contacts/contacts.component.html'
})
export class ContactsComponent implements OnInit {
contacts: Contact[];
errorMessage: string;
constructor(
private router: Router,
private contactService: ContactService) { }
ngOnInit() {
this.getContacts();
}
getContacts() {
this.contactService.getContacts()
.subscribe(
contacts => this.contacts = contacts,
error => this.errorMessage = <any>error
);
}
}
我的服务
import {Injectable} from 'angular2/core';
import {Http, Response, Headers, RequestOptions} from 'angular2/http';
import {Contact} from './contact';
import {Observable} from 'rxjs/Observable';
@Injectable()
export class ContactService {
private contacts: Array<Contact> = null;
constructor (private http: Http) {
}
getContacts() {
// Check first if contacts == null
// if not, return Observable(this.contacts)? <-- How to?
return this.http.get(url)
.map(res => <Contact[]> res.json())
.do(contacts => {
this.contacts = contacts;
console.log(contacts);
}) // eyeball results in the console
.catch(this.handleError);
}
private handleError (error: Response) {
// in a real world app, we may send the server to some remote logging infrastructure
// instead of just logging it to the console
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
}
你就在那里。如果内存中已有数据,可以在 RxJS 4.of
observable (equivalent of return/just
中使用 of
observable (equivalent of return/just
。
getContacts() {
if(this.contacts != null)
{
return Observable.of(this.contacts);
}
else
{
return this.http.get(url)
.map(res => <Contact[]> res.json())
.do(contacts => this.contacts = contacts)
.catch(this.handleError);
}
}
这可能来得太晚了,但我一直在大量使用 sessionStorage 来处理我的一些工作。如果你因为人们四处跳动而失去状态,你仍然有你的数据。
getSubjects(): Observable<Subject[]> {
let SubjectsString = sessionStorage.getItem("Subjects")
if (SubjectsString) {
let subjects: Subject[] = JSON.parse(SubjectsString);
console.log("GETTING DATA FROM SESSION STORAGE")
return Observable.of(subjects);
} else {
let url = `${this.apiHost}/api/subject`;
return this.http.get(url)
.map(res =>{
sessionStorage.setItem("Subjects",JSON.stringify(res.json()));
return res.json();
})
}
}
在这个例子中,我有一个 class 的 Subject 和一个 apiHost 的定义,但其余部分非常简单。您为可观察对象调用该服务。您的组件不知道数据在哪里,也不关心。该服务检查本地存储,如果有,将其转换为可观察对象并returns,如果没有,它会去获取它,然后将其保存到本地存储,然后returns它。
就我而言,我有一些包含数百页的大型应用程序。用户可能会从一个漂亮的新 Angular4 页面跳转到 classic ASP 年龄并再次返回多次。将所有菜单项甚至搜索结果都保存在会话存储中真是救星。
这里是快速解决方案:
getSomething():Observable<Object[]>{
return new Observable(observable => {
this.http.get('example.com').subscribe(results => {
observable.next(results.json());
observable.complete();
});
});
}
像我这样的人想要的不一样,从 string[]
到 Observable<string>
。
这是一个涉及转换的例子:
import { from } from 'rxjs/observable/from';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toArray';
const ids = ['x12', 'y81'];
let userUrls: string[];
from(ids) // Converting string[] into Observable<string>
.map(id => 'http://localhost:8080/users/' + id)
.toArray()
.subscribe(urls => userUrls = urls);
希望对其他人有所帮助。
import { of } from 'rxjs';
return of(this.contacts);
在 angular7 中,只需放置 of()
就足够了。无论你把什么放进去
of()
将更改为可观察。这里,this.contacts
被转换
可以观察到。
import { of } from 'rxjs';
getContacts() {
if(this.contacts != null)
{
return of(this.contacts);
}
}
您也可以使用 Observable.of(resultArray);
来自 import { Observable } from 'rxjs;'
包
我有一个通过 http 从服务获取数据的组件,问题是我不想每次显示该组件时都访问 API 后端。我希望我的服务检查数据是否在内存中,如果是,return 一个可观察到的数组在内存中,如果不是,则发出 http 请求。
我的组件
import {Component, OnInit } from 'angular2/core';
import {Router} from 'angular2/router';
import {Contact} from './contact';
import {ContactService} from './contact.service';
@Component({
selector: 'contacts',
templateUrl: 'app/contacts/contacts.component.html'
})
export class ContactsComponent implements OnInit {
contacts: Contact[];
errorMessage: string;
constructor(
private router: Router,
private contactService: ContactService) { }
ngOnInit() {
this.getContacts();
}
getContacts() {
this.contactService.getContacts()
.subscribe(
contacts => this.contacts = contacts,
error => this.errorMessage = <any>error
);
}
}
我的服务
import {Injectable} from 'angular2/core';
import {Http, Response, Headers, RequestOptions} from 'angular2/http';
import {Contact} from './contact';
import {Observable} from 'rxjs/Observable';
@Injectable()
export class ContactService {
private contacts: Array<Contact> = null;
constructor (private http: Http) {
}
getContacts() {
// Check first if contacts == null
// if not, return Observable(this.contacts)? <-- How to?
return this.http.get(url)
.map(res => <Contact[]> res.json())
.do(contacts => {
this.contacts = contacts;
console.log(contacts);
}) // eyeball results in the console
.catch(this.handleError);
}
private handleError (error: Response) {
// in a real world app, we may send the server to some remote logging infrastructure
// instead of just logging it to the console
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
}
你就在那里。如果内存中已有数据,可以在 RxJS 4.of
observable (equivalent of return/just
中使用 of
observable (equivalent of return/just
。
getContacts() {
if(this.contacts != null)
{
return Observable.of(this.contacts);
}
else
{
return this.http.get(url)
.map(res => <Contact[]> res.json())
.do(contacts => this.contacts = contacts)
.catch(this.handleError);
}
}
这可能来得太晚了,但我一直在大量使用 sessionStorage 来处理我的一些工作。如果你因为人们四处跳动而失去状态,你仍然有你的数据。
getSubjects(): Observable<Subject[]> {
let SubjectsString = sessionStorage.getItem("Subjects")
if (SubjectsString) {
let subjects: Subject[] = JSON.parse(SubjectsString);
console.log("GETTING DATA FROM SESSION STORAGE")
return Observable.of(subjects);
} else {
let url = `${this.apiHost}/api/subject`;
return this.http.get(url)
.map(res =>{
sessionStorage.setItem("Subjects",JSON.stringify(res.json()));
return res.json();
})
}
}
在这个例子中,我有一个 class 的 Subject 和一个 apiHost 的定义,但其余部分非常简单。您为可观察对象调用该服务。您的组件不知道数据在哪里,也不关心。该服务检查本地存储,如果有,将其转换为可观察对象并returns,如果没有,它会去获取它,然后将其保存到本地存储,然后returns它。
就我而言,我有一些包含数百页的大型应用程序。用户可能会从一个漂亮的新 Angular4 页面跳转到 classic ASP 年龄并再次返回多次。将所有菜单项甚至搜索结果都保存在会话存储中真是救星。
这里是快速解决方案:
getSomething():Observable<Object[]>{
return new Observable(observable => {
this.http.get('example.com').subscribe(results => {
observable.next(results.json());
observable.complete();
});
});
}
像我这样的人想要的不一样,从 string[]
到 Observable<string>
。
这是一个涉及转换的例子:
import { from } from 'rxjs/observable/from';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toArray';
const ids = ['x12', 'y81'];
let userUrls: string[];
from(ids) // Converting string[] into Observable<string>
.map(id => 'http://localhost:8080/users/' + id)
.toArray()
.subscribe(urls => userUrls = urls);
希望对其他人有所帮助。
import { of } from 'rxjs';
return of(this.contacts);
在 angular7 中,只需放置 of()
就足够了。无论你把什么放进去
of()
将更改为可观察。这里,this.contacts
被转换
可以观察到。
import { of } from 'rxjs';
getContacts() {
if(this.contacts != null)
{
return of(this.contacts);
}
}
您也可以使用 Observable.of(resultArray);
来自 import { Observable } from 'rxjs;'
包