0

我有一个这样的 ngrx 商店: export default compose(storeLogger(), combineReducers) ({ auth: authReducer, users: userReducer }); 在服务中,我尝试执行以下操作:

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)});
  }

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

4

1 回答 1

0

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

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

因为 Observable 在您订阅之前是惰性的,所以订阅会触发运算符链执行。如果您在 do 中拥有 console.log 并且没有订阅,则 console.log 根本不会发生。

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

http://jsbin.com/bosobuj/edit?html,js,控制台,输出

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);

输出为 5,因为只执行了 source2 "do"。

于 2016-08-08T12:33:06.247 回答