Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 2 HttpClient需要。订阅_Angular_Angular2 Observables_Angular Httpclient - Fatal编程技术网

Angular 2 HttpClient需要。订阅

Angular 2 HttpClient需要。订阅,angular,angular2-observables,angular-httpclient,Angular,Angular2 Observables,Angular Httpclient,我传递了一个如下所示的方法: add = (): Observable<MatDialogRef<W, any>> => { let obs$ = this.service.getNew$().pipe(map(result => { this.applyNewItemProperties(result); return this.openDialog(result); })); obs$.subscribe(); retu

我传递了一个如下所示的方法:

add = (): Observable<MatDialogRef<W, any>> => {
  let obs$ = this.service.getNew$().pipe(map(result => {
    this.applyNewItemProperties(result);
    return this.openDialog(result);
  }));

  obs$.subscribe();

  return obs$;
}
add=():可观察=>{
让obs$=this.service.getNew$().pipe(映射(结果=>{
此.applyNewItemProperties(结果);
返回此.openDialog(结果);
}));
obs$.subscribe();
返回obs$;
}
getNew$()
本质上是调用
返回HttpClient.get


我的问题是:这样可以吗?我不需要订阅,除了没有订阅,
get
不会启动。我需要在什么地方取消订阅吗?我错过了一个更好的模式吗?

你需要在某个地方订阅,因为如果没有订阅,你的可观察对象仍然是冷冰冰的。被观察者是懒惰的,除非有人关心他们的答案,否则他们是不会工作的(使他们变得热辣)。因此,是的,这是可以的(也是预期的),尽管我会质疑,既然您正在返回,为什么链上没有任何东西订阅
obs$


严格地说,您不需要
取消订阅
,因为这两种方法都应该完成其
可观察的
。只有当可观察对象仍然很热,但您不再关心结果时,才需要取消订阅。

问题是您正在对该对象做什么。您可以在异步管道的模板中直接使用observable,Angular将为您处理订阅。您还可以使用.toPromise(),它的行为就像一个承诺。所以这取决于您的使用情况。@evayly我相信
toPromise
也会保持冷状态,除非
wait
ed,但我可能弄错了。@BradleyDotNET toPromise在使用之前保持冷状态。所以是的。但它没有任何“退订”机制。因此,您可以避免在那里发生任何不好的事情。然后,从
HttpClient.get()
返回的对象被传递到要显示/编辑的材质对话框。我真的不需要它本身是“可观察的”。不,我没有看到泄漏。