RxJava。 Observable.delay工作奇怪(最后缺少一些项目)

时间:2015-10-02 20:27:57

标签: java rx-java

我正在努力了解RxJava。我的测试代码是:

var indiceMateria = $('table#tabla_materia tr.ptype input.ptype[value="148"]').index();
console.log('FILA DE LA MATERIA PRIMA: '+indiceMateria); // 1

没有import rx.Observable; import rx.Subscriber; import rx.functions.Action1; import java.util.concurrent.TimeUnit; public class Hello { public static void main(String[] args) { Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { try { Thread.sleep(1000); subscriber.onNext("a"); Thread.sleep(1000); subscriber.onNext("b"); Thread.sleep(1000); subscriber.onNext("c"); Thread.sleep(1000); subscriber.onNext("d"); Thread.sleep(1000); subscriber.onNext("e"); Thread.sleep(1000); subscriber.onNext("f"); Thread.sleep(1000); subscriber.onNext("g"); Thread.sleep(1000); subscriber.onNext("h"); } catch (InterruptedException e) { subscriber.onError(e); } } }); observable .delay(2, TimeUnit.SECONDS) .subscribe(new Action1<String>() { @Override public void call(String string) { System.out.println(string); } }); } } 我有输出:a b C d Ë F G H 但.delay(2, TimeUnit.SECONDS) 输出缺少“g”和“h”: 一个 b C d Ë ˚F

怎么会这样?文档说延迟只是发出源Observable发出的项目及时向前移动指定的延迟

1 个答案:

答案 0 :(得分:12)

您正在使用计划的delay重载在不同的线程上工作并导致隐式竞争条件。所有时间运算符(例如delaybuffer和{{1需要使用调度程序为以后计划效果,如果您不了解它并仔细使用它,这可能会导致意外的竞争条件。在这种情况下,延迟操作员在单独的线程池上调度下游工作。以下是测试中的执行顺序(在主线程上)。

  1. 您的Observable已订阅并在window
  2. 之前等待1000毫秒
  3. 接下来它被延迟收到了。这将调度下游onNext 2秒钟。
  4. 控制流程立即返回到您的观察点,等待1000毫秒。
  5. 可观察onNext("a")延迟。延迟安排&#34; b&#34;的onNext。 2秒钟后。
  6. ....(重复)
  7. 当您的observable调用onNext("b")时,它会安排工作,然后立即从subscribe返回并终止您的测试(导致计划的工作消失)。
  8. 为了让它以异步方式执行,您可以安排trampoline调度程序实现的延迟。

    onNext("h")