Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java RxJava-在map和doOnSuccess中执行长时间运行的任务有任何问题吗_Rx Java_Reactive Programming_Rx Java2 - Fatal编程技术网

Rx java RxJava-在map和doOnSuccess中执行长时间运行的任务有任何问题吗

Rx java RxJava-在map和doOnSuccess中执行长时间运行的任务有任何问题吗,rx-java,reactive-programming,rx-java2,Rx Java,Reactive Programming,Rx Java2,考虑以下几点 类虚拟{ 私人娱乐第一步():单人{ 返回单身。只是(“大佛”) .subscribeOn(Schedulers.io()) } 乐趣行动1(){ 第一步() .地图{ 地图素材(it) } 杜恩先生{ println(${Thread.currentThread().name}it) } 杜恩塞斯先生{ 行动(it) } .flatMap{ return@flatMap另一步(it) } .observeOn(Schedulers.trampoline()) .subscribe

考虑以下几点

类虚拟{
私人娱乐第一步():单人{
返回单身。只是(“大佛”)
.subscribeOn(Schedulers.io())
}
乐趣行动1(){
第一步()
.地图{
地图素材(it)
}
杜恩先生{
println(${Thread.currentThread().name}it)
}
杜恩塞斯先生{
行动(it)
}
.flatMap{
return@flatMap另一步(it)
}
.observeOn(Schedulers.trampoline())
.subscribe({result->
println(结果)
}, {
it.printStackTrace()
})
}
私人趣味地图素材(it:String):Int{
println(“线程${thread.currentThread().name}上的mapStuff”)
线程睡眠(2000L)
把它还给我
}
私人娱乐活动(i:Int){
println(“线程${thread.currentThread().name}上的someVoidAction”)
线程睡眠(2000L)
}
}
我能看到的唯一缺点是:

  • 它的可读性不是很强——看看行动链,你无法立即判断“mapStuff”和“doVoidAction”实际上是长期运行的任务,就像你如何判断“另一步”一样
  • 理论上,人们可能希望为不同的任务使用不同的线程。例如,“mapStuff”可能需要
    Schedulers.computation()
    而不是
    Schedulers.io()
    。然而,在实践中,
    Schedulers.io()
    在我的项目中99%的时间都在使用。那么,我们需要关心吗
  • 根据需要,对于罕见的情况,我可能希望在“mapStuff”或“doVoidAction”上应用2秒超时和“出错时恢复”逻辑。但再一次,这是情境性的,所以在一般情况下,以非反应性的方式做“mapStuff”或“doVoidAction”是可以的,对吗
  • 还有其他我没有看到的问题吗

    以RxJava方式编写所有内容的缺点是需要更多的工作,这取决于RxJava one的流利程度(或痴迷程度)

    这里的简单伪代码非常简单,但在现实生活中可能会变得更加复杂:

    fun action2(){
    第一步()
    .平面图{
    地图(it)
    }
    .平面图{
    return@flatMapDostuff反应性(it)
    }
    .平面图{
    return@flatMap另一步(it)
    }
    .observeOn(Schedulers.trampoline())
    .subscribe({result->
    println(结果)
    }, {
    it.printStackTrace()
    })
    }
    私人娱乐场所(i:Int):单人{
    返回Completable.fromAction{
    println(“someVoidAction$i”)
    }
    .delay(2L,TimeUnit.SECONDS,Schedulers.io())
    .第三(单身。只是(我))
    }
    私人娱乐地图(it:字符串):单人{
    返回单曲。仅(它的长度)
    .delay(2L,TimeUnit.SECONDS,Schedulers.io())
    }
    
    遵循以下步骤,您不应将导致副作用的代码放入
    映射图中
    。您应该始终使副作用代码显式

    引起副作用的代码只应在创建可观察的、订阅的或很少在do操作符中出现。这将使任何阅读代码的人都清楚地了解正在发生的事情,并且也将使我们更容易地了解链的哪一部分是可测试的,或者不可测试的


    do
    操作符中的副作用是正常的,事实上它们是预期的,但是请确保您了解,这些副作用将在每次订阅可观察对象时发生。依我看,如果你能把代码放在订阅中,那就这样做。

    你放在地图中的这些“长时间运行的任务”。。。它们是否包含副作用(涉及IO、DB或服务器)或只是计算密集型?是的,它们通常都有