Observable 完成后返回项目列表

Posted

技术标签:

【中文标题】Observable 完成后返回项目列表【英文标题】:Return a list of items after Observable is complete 【发布时间】:2021-08-25 09:01:09 【问题描述】:

我需要返回一个项目列表,但在此之前我必须检查一些特定的项目。我只能异步执行此操作。

fun getItemList() : List<Model> 
val list = mutableListOf<Model>()
list.add(model1)
list.add(model2)

Observable.fromCallable  findParticularModel() 
        .subscribeOn(Schedulers.newThread())
        .observeOn(androidSchedulers.mainThread())
        .subscribe(object : Observer<String> 
            override fun onSubscribe(d: Disposable?) 

            

            override fun onNext(modelId: String) 
                list.add(createModelFromId(modelId))
            

            @SuppressLint("TimberExceptionLogging")
            override fun onError(e: Throwable?) 
                Timber.e(e?.message)
            

            override fun onComplete() 

            

        )

return list

如何在Observable完成后才返回列表

【问题讨论】:

如果getItemList在主线程上运行,这是不可能的,因为它会死锁。您必须将其转换为 Single&lt;List&lt;Model&gt;&gt; 并继续编写。 @akarnokd,是的,getItemList 旨在在主线程上调用。你能提供一个解决方案吗? 您需要将整个getItemList() 重新设计为异步的,而不仅仅是其内容。有一些技术方法可以等待列表准备好返回,但如果你这样做,代码将等同于 return findParticularModel() 之类的东西 - 没有所有这些异步内容。无论您想在返回后对生成的list 做什么,都需要在onComplete() 中执行此操作。您的函数无法返回列表并同时异步工作。 或者,您可以切换到调用堆栈中较早的某个地方的后台线程,然后使此函数完全同步(因此删除 Rx 的东西)。 【参考方案1】:

以下是如何创建和使用此类异步数据源的示例:

fun getItemList() : Single<List<Model>> 
    Single.fromCallable  findParticularModel() 
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .map 
             val list = mutableListOf<Model>()
             list.add(model1)
             list.add(model2)
             list.add(createModelFromId(it))
             list
        
        


getItemList().subscribe(
    // here you have $it as list on the main thread
, 
    Timber.e(it?.message)
)

【讨论】:

以上是关于Observable 完成后返回项目列表的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤 rxdart 中的 observable 列表

TypeScript - 等待 observable/promise 完成,然后返回 observable

RxJS 等待订阅 Observable 完成

在 Angular 11 中完成 Observable 和渲染后如何运行代码?

在哪里订阅 Angular 中的 observable、构造函数或 ngoninit [关闭]

从(服务器发送的)EventSource 创建一个 RxJS Observable