没有长时间使用Angular2,如果我没有正确理解observable,那么道歉......在一个组件中我订阅了位于服务类中的getData。我想要的是http get调用并在url更改时自动将更改发送回调用者/订阅者(可能还有任何其他URL参数)。怎么能实现这一目标?我可能不能正确理解可观测量吗?
@Injectable()
export class HttpService {
url: string;
constructor(
private http: Http
) {}
getData() {
return this.http.get(`${this.url}`)
.map((res:Response) => res.json());
}
setUrl(url) {
this.url = url;
}
}
答案 0 :(得分:4)
通过您的实施,getData()
会使用在调用getData()时}保持的任何值。换句话说,如果您在致电this.url
后更改this.url
,则不会发生任何事情。
要执行您描述的操作,您需要将不同URL的流包装在一个observable中:
getData()
此代码肯定比原始版本更复杂。我已添加评论以澄清,但如果您是RxJS新手,我强烈建议您花一些时间reading the manual和watching some tutorials。
您想了解:
import {Subject} from 'rxjs/Subject';
@Injectable()
export class HttpService {
// The `url` property is replaced with an observable emitting a stream of URLs.
private _urlsStream: Subject<string> = new Subject<string>();
constructor(private http: Http) {}
// The http.get() now gets its urls from the url stream.
// Every time a new url is pushed to the stream, a new request is executed.
getData() {
return this._urlsStream.asObservable()
.mergeMap((url: string) => this.http.get(url))
.map((res: Response) => res.json());
}
setUrl(url) {
// Setting an url pushes the given url to the stream.
this._urlsStream.next(url);
}
}
,这是一种特殊类型的observable,可以发出值并被订阅)。Subject
到&#34;项目&#34;一个observable - URL流 - 到另一个observable - HTTP请求。)