-1

我是来自 Python 背景的 Angular4 新手,并试图了解创建 HTTPClient 服务然后在组件中使用该服务的最佳模式。

我的服务如下所示:

@Injectable()
export class DatasetService {
  constructor(private http: HttpClient) { }

  getDatasets(): Observable<Array<Dataset>> {
    // Get list of all datastes
    return this.http.get<Array<Dataset>>('http://localhost:5000/api/v2/admin/dataset/list');
  }
}

我的组件使用如下服务:

export class DataManagementComponent implements OnInit {

  constructor(private datasetService: DatasetService) { }

  ngOnInit() {
    this.datasetService.getDatasets()
      .subscribe(
        data => {
           console.log(data['datasets']);
        },
        error => {
          if (error.status === 404) {console.log('No records'); }
        });
    }
}

这行得通,但感觉服务有漏洞,因为消费者必须映射数据并处理错误。而如果我在 Python 中这样做,我会有类似的东西:

try:
    mydata = DatasetService.getDatasets()
except as e:
    print(e)   
4

1 回答 1

1

处理错误的位置和方式完全取决于您,您可以在服务层中捕获:

getDatasets(): Observable<Array<Dataset>> {
  // Get list of all datastes
  return this.http.get<Array<Dataset>>('http://localhost:5000/api/v2/admin/dataset/list')
   .catch(err => { 
     console.log('I caught an error');
     // maybe redirect?
     return Observable.throw(err); //option to rethrow
     //return Observable.of({isError:true, message: err.json()}); //or some standard error interface
     //return Observable.empty(); //or just swallow it
   });
}

或者像您一样在组件级别执行此操作,通常面向用户的界面想要了解错误,具体取决于类型,您拥有世界上所有的灵活性。这里没有对错,因为这取决于您的应用程序和您的 UI 以及您尝试构建的 UX。

但是,对于映射数据,您可能不想订阅组件代码,并且希望尽可能使用异步管道

dataSet$: Observable<Array<Dataset>>;
ngOnInit() {
  this.dataSet$ = this.datasetService.getDatasets()
                     .map(data => data) // optional transformation of data
                     .catch(err => Observable.throw(err)); //optional component error handling
}

然后在模板中:

<div *ngIf="dataSet$ | async as dataSet; else loading>
  <!-- logic to display your data set goes here, can also use async in ngFor -->
</div>
<ng-template #loading>Optional Loading template...</ng-template>

让异步处理您的订阅要好得多,它会收到您订阅的任何内容的结果。这可以保证订阅管理始终得到正确处理,并保护您免受内存泄漏。订阅也使用异步触发更改检测,您的代码更简洁

于 2017-09-27T21:13:17.563 回答