为什么.map()会产生两种不同的输出?

时间:2017-04-30 04:33:08

标签: angular rxjs observable angular2-observables

为什么.map(()=> x + 3)vs .map((x)=> x +3)产生两种不同的结果?

请参阅下面的代码段。我有以下代码 app.component.ts

obs = Observable.of(1, 2, 3, 4);

ngOnInit() {
    this.usingMapToMakeInnerObservable();
}

usingMapToMakeInnerObservable() {
    this.obs
        .map(x => Observable.timer(500).map(() => x + 3)) // A. Output 4, 5, 6, 7
        //.map(x => Observable.timer(500).map((x) => x + 3)) // B. Output 3, 3, 3, 3
        .subscribe(
            x => console.log(x),
            err => console.error(err),
            () => console.log('done completed')
        );
}

1 个答案:

答案 0 :(得分:3)

在第一种情况下

.map(x => //here x value can be `1, 2, 3, 4`
   Observable.timer(500).map(() => x + 3) // x will hold from last map
) 

在上面的代码中,第一个x可以保存值1, 2, 3, 4,然后我们应用Observable.timer。之后在.map x中将有当前的数组项。

第二种情况

.map(x =>  //here x value can be `1, 2, 3, 4`
   Observable.timer(500).map((x) => x + 3) //x here it has own x so
) 

在上面的代码中,第一个地图x值可以保存1, 2, 3, 4个值。当我们为x Observable声明timer时。现在x将不再是父地图的x值。那么你必须经常Output: 3,3,3,3。原因是当我们没有向timer(Observable)提及任何其他参数时,它每次都会返回0