Angularjs 承诺链接/级联到RxJS angular 1到angular 2
我目前正在尝试将一些很好的$http承诺转换为angular2中的rxJs可观测值 我在angular 1中经常做的事情的一个非常简单的例子:Angularjs 承诺链接/级联到RxJS angular 1到angular 2,angularjs,angular,promise,rxjs,observable,Angularjs,Angular,Promise,Rxjs,Observable,我目前正在尝试将一些很好的$http承诺转换为angular2中的rxJs可观测值 我在angular 1中经常做的事情的一个非常简单的例子: // Some Factory in Angular 1 var somethings = []; var service = { all: all }; return service; function all() { return $http .get('api/somethings') .then(
// Some Factory in Angular 1
var somethings = [];
var service = {
all: all
};
return service;
function all() {
return $http
.get('api/somethings')
.then(function(response) {
somethings = parseSomethings(response.data);
return somethings;
});
}
// Some Controller in Angular 1
var vm = this;
vm.somethings = [];
vm.loading = true;
loadThings();
function loadThings() {
SomeFactory
.all()
.then(function(somethings) {
vm.somethings = somethings;
})
.finally(function() {
vm.loading = false;
})
}
现在我可以使用RxJs Observable和Subject实现与angular2类似的功能。但我不确定如何将“完成挂钩”返回给调用方。(例如:angular1控制器中的加载)
我为angular2所做的尝试与此类似:
// Some Service in Angular 2
export class SomeService {
private _somethings$: Subject<Something[]>;
private dataStore: {
somethings: Something[]
};
constructor(private http: Http) {}
get _somethings$() : Observable<Something[]> {
return this._somethings$.asObservable();
}
loadAll() {
this.http
.get(`api/somethings`)
.map(response => response.json())
.subscribe(
response => {
this.dataStore.somethings = parseSomethings(response.data);
this._somethings$.next(this.dataStore.somethings);
}
);
}
}
//Some Component in Angular 2
export class SomeComponent() {
constructor(private someService: SomeService) {}
ngOnInit() {
this.someService.loadAll();
this.somethings = this.someService.somethings$;
}
}
问题
- 在angular 2中,如何使用RxJs将完成钩子传递给调用方(例如angular 1控制器)
- 有哪些替代途径可以实现类似的行为
map()
而不是subscribe()
并在呼叫站点订阅即可
你可以用
return http.post(...).toPromise(val => ...))
或
要获得与Angular中相同的行为,您可以使用
链接后续调用。然后(…)
您的最后一个代码示例就可以了。只需使用map()
而不是subscribe()
并在呼叫站点订阅即可
你可以用
return http.post(...).toPromise(val => ...))
或
要获得与AngularJS相同的行为,您可以使用
链接后续调用。然后(…)
嘿,我对AngularJS不太熟悉。但据我所知,您想知道get
函数何时完成,以将加载设置为false?在这种情况下,将服务中的subscribe
块移动到您的组件,并在那里设置loading
标志。好的,我是否也应该在组件中取消订阅(比如在单击按钮调用create.subscribe()之后)否,对于http.get
和http.post
它们将在返回响应后完成,因此您无需取消订阅它们。太好了,谢谢您的澄清。我对AngularJS不太熟悉。但据我所知,您想知道get
函数何时完成,以将加载设置为false?在这种情况下,将服务中的subscribe
块移动到您的组件,并在那里设置loading
标志。好的,我是否也应该在组件中取消订阅(比如在单击按钮调用create.subscribe()之后)否,对于http.get
和http.post
它们将在返回响应后完成,因此您无需取消订阅它们。太好了,感谢您的澄清我也在考虑使用map。也可以这样做吗?map()
返回的值将转发给订阅服务器。如果您不想修改该值,但只会对每个事件造成一些副作用,那么do()
也可以。我是否可以假设多个.map调用只会像cascade
一样。然后会?完全正确。您可以级联各种运算符,也可以多次级联相同的运算符。最后只能执行一次subscribe()
。我也在考虑使用map。也可以这样做吗?map()
返回的值将转发给订阅服务器。如果您不想修改该值,但只会对每个事件造成一些副作用,那么do()
也可以。我是否可以假设多个.map调用只会像cascade
一样。然后会?完全正确。您可以级联各种运算符,也可以多次级联相同的运算符。仅subscribe()
最后只能执行一次。
return http.post(...).toPromise(val => ...))
return http.post(...).map(...).toPromise(val => ...))