Angularjs 承诺链接/级联到RxJS angular 1到angular 2

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(

我目前正在尝试将一些很好的$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(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 => ...))