我正在努力了解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发出的项目及时向前移动指定的延迟
答案 0 :(得分:12)
您正在使用计划的delay
重载在不同的线程上工作并导致隐式竞争条件。所有时间运算符(例如delay
,buffer
和{{1需要使用调度程序为以后计划效果,如果您不了解它并仔细使用它,这可能会导致意外的竞争条件。在这种情况下,延迟操作员在单独的线程池上调度下游工作。以下是测试中的执行顺序(在主线程上)。
window
onNext("a")
延迟。延迟安排&#34; b&#34;的onNext。 2秒钟后。onNext("b")
时,它会安排工作,然后立即从subscribe返回并终止您的测试(导致计划的工作消失)。 为了让它以异步方式执行,您可以安排trampoline调度程序实现的延迟。
onNext("h")