2016-08-07 72 views
0

我有一个NGRX店这样的: export default compose(storeLogger(), combineReducers) ({ auth: authReducer, users: userReducer }); 在服务我尽量做到以下几点:RxJs订阅的作品,但地图不

import 'rxjs/add/operator/do'; 
@Injectable() 
export class ApiService { 

    constructor(private _http: Http, private _store: Store<AppState>, private _updates$: StateUpdates<AppState>) { 
    _store.select<Auth>('auth').do(_ => {console.log("token:" +_.token)}); 
    } 

没有运营商的工作除了订阅。为什么?

+0

你有没有在任何地方导入适当的'rxjs/add'混合?你可以给[mcve]? – jonrsharpe

+0

你的意思是在顶部'''import'rxjs/add/operator/do';'''? – apreg

回答

0

如果你一般问为什么会发生这种情况,那么这里是Andre Stalz在他的博客上的解释。

http://staltz.com/how-to-debug-rxjs-code.html

由于观测量,直到您订阅懒惰,订阅触发操作链执行。如果在do和no订阅中有console.log,则console.log根本不会发生。

所以基本上这是操作员的典型行为。 在你的例子中,你附加了一个“do”操作符。没有订阅“do”操作符返回的observable,它不会触发。大多数运营商在运营商返回的观测值至少有一个订阅之前不会触发。地图就是其中之一。

http://jsbin.com/bosobuj/edit?html,js,console,output

var source = new Rx.BehaviorSubject(3); 
source.do(x=>console.log(x)); 

var source2 = new Rx.BehaviorSubject(5); 
source2.do(x=>console.log(x)).subscribe(x=> x); 

因为只有源2 “做” 执行输出为5。

+0

另一件需要注意的事情是do或map运算符将在observable上每次发布新值时为每个订阅执行一次。所以如果你有3个订阅,并且发射了一个新值,那么这个操作员运行3次。 – wiredprogrammer