2017-04-23 51 views
3

在使用observables的Angular4/Ionic3环境中。滑块在页面上的幻灯片。当一个人滑动移动到下一张幻灯片时,会发射一个多步骤,长时间运行的观测值。目前,当一个人再次滑动第二个可观察实例时(在第一个实例完成之前)。防止Observable再次运行直到完成

我该如何使第一个可观察物等待第二个可观察物完成?我不想阻止该人滑动。滑动事件应该简单地排列下一个可观察对象。

当前时间轴

  1. Swipe1
  2. 可观察的Instance1 =开始
  3. Swipe2
  4. 可观察实例2 =开始
  5. 可观察的Instance1 =端
  6. 可观察实例2 =端

希望的时间轴

  1. Swipe1
  2. 可观察的Instance1 =开始
  3. 可观察的Instance1 =端
  4. Swipe2
  5. 可观察实例2 =开始
  6. 可观察实例2 =端

当前可观察伪码

private slideNextStart(event) { 

    // Don't let this Observable be called again until it finishes. 
    Observable.of(null) 
    .flatMap(() => { 
     console.log('start'); 
     // Do something. 
    }) 
    .flatMap(() => { 
     // Do something else. 
    }) 
    .flatMap(() => { 
     // Do another something else. 
    }) 
    .subscribe(() => { console.log('end'); }); 

Angular2转换的代码从Julia的回答

import { Observable } from 'rxjs/Rx'; 
import { Subject } from 'rxjs/Subject'; 

let subject = new Subject(); 
subject.asObservable() 
    .concatMap((x: Observable<any>) => { return x }) 
    .subscribe(x => console.log(x)); 

// request 1 
subject.next(Observable 
    .timer(4000) 
    .map(() => { console.log('req1') }) 
    .mapTo('req1')); 

// request 2 
subject.next(Observable.of('req2')); 
+0

你不想阻止第二刷卡的人,但确实在比第一个不同的效果,第二调剂结果呢?看起来你想让观察者同步,这不是他们所做的。如果第三次,第四次,第五次刷卡,会发生什么?不确定的情况下,但也许一些加载菜单将更好的选择(它会覆盖屏幕,直到第一次滑动observable完成) – pezetem

回答

1

Observable.concatMap是专为这一点。 “将每个源值投影到在输出Observable中合并的Observable,并以序列化的方式等待每个源合并到下一个。”concatMap

// subject to emit observables 
let subject = new Rx.Subject(); 

// do concatMap to sequence the requests 
subject.asObservable() 
.concatMap(x=>x) 
.subscribe(x=>console.log(x)) 

// request 1 
subject.next(Rx.Observable 
    .timer(4000) 
    .mapTo('req1')); 

// request 2 
subject.next(Rx.Observable.of('req2')); 
+0

完美!但是,我一直无法在Angular2环境中正常工作。请求正在输出到控制台,但请求本身没有运行。我的console.log('req1')不输出。控制台记录两个项目(1)Observable {_isScalar:false,source:Observable,operator:MapToOperator}(2)ScalarObservable {_isScalar:true,value:“req2”,scheduler:null}。 –

+0

我的Angular2/TypeScript代码错了。已更新问题以更正代码。 –

相关问题