【发布时间】:2017-04-23 02:12:32
【问题描述】:
在使用可观察对象的 Angular4/Ionic3 环境中。页面上带有幻灯片的滑块。当一个人滑动移动到下一张幻灯片时,会触发一个多步、长时间运行的 observable。目前,当一个人再次滑动时,第二个 observable 实例会运行(在第一个实例完成之前)。
如何让第二个 observable 等待第一个 observable 完成?我不想阻止此人滑动。 swipe 事件应该简单地将下一个 observable 排队。
当前时间线
- 滑动1
- 可观察的实例 1 = 开始
- 滑动2
- 可观察实例2 = 开始
- 可观察实例 1 = 结束
- 可观察的实例 2 = 结束
所需时间线
- 滑动1
- 可观察的实例 1 = 开始
- 可观察实例 1 = 结束
- 滑动2
- 可观察实例2 = 开始
- 可观察的实例 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'); });
来自 Julia 答案的 Angular2 翻译代码
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'));
【问题讨论】:
-
您不想阻止某人进行第二次滑动,但第二次交换的效果是否与第一次不同?似乎您想让 observables 同步,这不是它们的目的。如果人们第三次、第四次、第五次滑动会发生什么?不确定情况,但也许一些加载菜单会是更好的选择(它会覆盖屏幕直到第一次滑动可观察完成)
标签: angular observable