Rx java 什么';除了System.currentTimeMillis()之外,使用.defer()也是一个很好的用例
我有以下代码:Rx java 什么';除了System.currentTimeMillis()之外,使用.defer()也是一个很好的用例,rx-java,reactive-programming,rx-java2,Rx Java,Reactive Programming,Rx Java2,我有以下代码: Single<Player> createPlayerSingle() { Integer playerId = Random.nextInteger(); return playersDao.createSingle(id); } 其想法是,如果我们创建另一个createPlayerSingle()订阅,我们将不会生成新id(基本上我们将重用旧id) 我不明白为什么会这样。那么,我们是否应该将defer添加到以某个同步代码块开头的每个函数中 Sin
Single<Player> createPlayerSingle() {
Integer playerId = Random.nextInteger();
return playersDao.createSingle(id);
}
其想法是,如果我们创建另一个createPlayerSingle()
订阅,我们将不会生成新id(基本上我们将重用旧id)
我不明白为什么会这样。那么,我们是否应该将defer
添加到以某个同步代码块开头的每个函数中
Single<T> methodSingle() {
return Single.defer(() -> {
Integer id = Random.nextInteger(); // sync block of code
....
return dao.createSingle(id);
});
}
当您编写一个返回单个(或任何其他RxJava流类型)的方法时,您返回的是可以多次订阅(可能是并发订阅)的内容
Defer
是一个功能强大(但很简单)的操作符,允许您定义每个订阅状态。例如,如果您想要第一次发射的特殊行为:
Observable<Integer> numbers = Observable.just(1, 2, 3);
Observable<Integer> numbers2 =
Observable.defer(() -> {
boolean[] first = new boolean[] {true};
return numbers.doOnNext(x -> {
if (first[0]) {
System.out.println("first=" + x);
first[0] = false;
} else {
System.out.println(x);
}
});
});
numbers2.subscribe();
numbers2.subscribe();
关于此代码:
Single<T> methodSingle(Object object) {
return Single.defer(() -> {
Integer id = object.id; // sync block of code
....
return dao.createSingleFrom(id);
});
}
singlemethodsingle(对象){
返回单个。延迟(()->{
整数id=object.id;//同步代码块
....
返回dao.createSingleFrom(id);
});
}
如果
对象
是不可变的,那么这是毫无意义的,您可以像您怀疑的那样忽略延迟
。每次我觉得需要处理.create(),我意识到使用.defer()很简单。.defer()prep代码通常是启动查询并将结果推送到可观察的.just()中的代码
Observable<Integer> numbers = Observable.just(1, 2, 3);
Observable<Integer> numbers2 =
Observable.defer(() -> {
boolean[] first = new boolean[] {true};
return numbers.doOnNext(x -> {
if (first[0]) {
System.out.println("first=" + x);
first[0] = false;
} else {
System.out.println(x);
}
});
});
numbers2.subscribe();
numbers2.subscribe();
first=1
2
3
first=1
2
3
Single<T> methodSingle(Object object) {
return Single.defer(() -> {
Integer id = object.id; // sync block of code
....
return dao.createSingleFrom(id);
});
}