在Angular 2服务中创建并返回Observable。
在Angular 2服务中创建并返回Observable。
这更像是一个“最佳实践”的问题。有三个角色:一个Component
,一个Service
和一个Model
。Component
正在调用Service
从数据库中获取数据。Service
正在使用以下代码返回一个Observable
:
this.people = http.get('api/people.json').map(res => res.json());
Component
可以直接订阅这个Observable
:
peopleService.people .subscribe(people => this.people = people); }
然而,我真正想要的是Service
返回一个由从数据库中检索到的数据创建的Model数组
对象。我意识到Component
可以在订阅方法中创建这个数组,但我认为如果Service
能够完成并使其可供Component
使用,会更加清晰。
Service
如何创建一个包含该数组的新Observable
并返回它?
问题的出现原因是需要在Angular 2服务中创建和返回Observable对象。需要根据不同的情况返回不同的Observable对象。解决方法是根据条件判断是否需要返回静态数据,如果是静态数据,则使用Observable.of()方法创建Observable对象,并使用map操作符将对象转换为字符串。如果不是静态数据,则使用http.get()方法获取数据,并使用map操作符将响应体转换为文本。对于Angular 7.x.x,需要使用pipe()方法进行映射,具体操作可参考链接:https://stackoverflow.com/a/54085359/986160。还可以参考这个问题的答案:https://stackoverflow.com/a/35219772/986160。
问题的出现原因是在Angular 2中,使用Observables进行组件通信时,需要创建和返回Observables的服务。在这个例子中,MissionService是一个服务,用于在组件之间传递任务的名称。它创建了一个私有的Subject对象_missionAnnouncedSource,并将其转换为Observable对象missionAnnounced$,以便其他组件可以订阅它。announceMission方法用于向_missionAnnouncedSource发送新的任务名称。
解决方法是在组件中使用MissionService来订阅missionAnnounced$ Observable,并在回调函数中更新组件的任务名称。在MissionControlComponent中,构造函数中注入了MissionService,并使用missionService.missionAnnounced$.subscribe方法来订阅任务名称的变化。当任务名称发生变化时,回调函数将更新组件的任务属性。announce方法用于调用MissionService的announceMission方法来发送新的任务名称。
这个例子中的代码可以在Angular 2文档的示例中找到,详细说明了如何创建和返回Observables的服务以及如何在组件中使用它们进行双向通信。完整可工作的示例可以在https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service找到。
在Angular 2 Service中创建和返回Observable的问题的出现原因是为了解决在异步操作中处理结果的问题。在以前的版本中,使用EventEmitter来创建Observable,但是在Alpha 45版本中,需要使用toRx()方法将EventEmitter转换为Observable。然而,在Alpha 46版本中,可以直接返回EventEmitter。为了解决这个问题,可以使用ReplaySubject、AsyncSubject和Observable.create()来创建和返回Observable。
ReplaySubject是一个可以向订阅者推送上一个值的主题。可以使用ReplaySubject(1)来创建一个ReplaySubject,它允许在新的订阅者附加时传递最后存储的值。使用project.next(result)将结果推送到ReplaySubject,可以在加载后添加延迟订阅。
AsyncSubject是一个可以在完成后仍然返回最后一个值的主题。使用project.next(result)将结果推送到AsyncSubject,并使用project.complete()来完成主题。即使主题被关闭,仍然可以订阅到最后一个加载的值。
可以使用Observable.create()方法直接从调用中返回Observable。在这个方法中,可以使用observer.next()将结果推送到Observable,并使用observer.complete()来关闭流。
为了处理嵌套调用,可以使用ReplaySubject和FlatMap。使用ReplaySubject(1)创建一个ReplaySubject,并在每个http调用中使用flatMap来处理结果。
在Angular 2 Service中创建和返回Observable的解决方法是使用ReplaySubject、AsyncSubject和Observable.create()来创建和返回Observable。这样可以方便地处理异步操作的结果,并能够在需要时订阅到最新的值。