代码之家  ›  专栏  ›  技术社区  ›  Karl Jamoralin

仅有一个的延迟()未执行

  •  2
  • Karl Jamoralin  · 技术社区  · 7 年前

    我有一个问题,我的单身。未执行延迟块。

    documentRepository。调用getDocuments()从DB获取文档:

    class GetReports
    @Inject constructor(
            private val reportRepository: ReportRepository,
            private val documentRepository: DocumentRepository,
            threadExecutor: ThreadExecutor,
            postExecutionThread: PostExecutionThread
    ) : SingleUseCase<List<Report>, Void?>(
            threadExecutor, postExecutionThread) {
    
        override fun buildUseCaseObservable(params: Void?): Single<List<Report>> {
            return reportRepository
                    .getReports()
                    .flatMap { reports ->
                        val finalReports = ArrayList<Report>()
    
                        reports.forEach { report ->
                            documentRepository.getDocuments(report.id!!)
                                    .map { documents ->
                                        finalReports.add(Report(report.id, report.name, report.status,
                                                report.dateCreated, documents))
                                    }
                        }
    
                        Single.just(finalReports.toList())
                    }
        }
    
    }
    

    第一块木材。d()日志代码被执行,所以我知道它进入了这个方法,但整个过程都是单一的。延迟之后的代码不会执行——调试不会进入块和第二个木料内部。d()日志记录代码也不会执行。

    override fun getDocuments(reportId: Long): Single<List<Document>> {
            Timber.d("Getting documents for report ID $reportId")
    
            return Single.defer<List<Document>> {
                try {
                    Timber.d("Getting document cursor for report ID $reportId")
                    val documentCursor = database.query(
                            Db.DocumentTable.TABLE_NAME,
                            null,
                            Db.DocumentTable.REPORT_ID + "= $reportId",
                            null,
                            null,
                            null,
                            null
                    )
                    Timber.d("Got document cursor for report ID $reportId. Row count: ${documentCursor.count}")
                    getDocuments(documentCursor)
                } catch (e: Exception) {
                    Timber.e(e, "Error getting documents for report ID $reportId")
                    Single.error(e)
                }
            }
        }
    

    我做得不对吗?任何帮助都将不胜感激。谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   akarnokd    7 年前

    正如@azizbekian所说,没有任何订阅 getDocuments . 但是,呼叫 subscribe() 在里面 flatMap 因为它破坏了流程,所以不鼓励。相反,您应该创建一个内部流,并在 平面图 报告数量:

    override fun buildUseCaseObservable(params: Void?): Single<List<Report>> {
        return reportRepository
                .getReports()
                .flatMap { reports ->
                    Observable.fromIterable(reports)
                    .concatMap { report ->
                        documentRepository.getDocuments(report.id!!) 
                        .map { documents ->
                             Report(report.id, report.name, report.status,
                                     report.dateCreated, documents))
                        }.toObservable()
                    }
                    .toList()
                }
    }
    
        2
  •  2
  •   azizbekian    7 年前

    以下是您最重要的工作:

    
        documentRepository.getDocuments(...)
                          .map { ...}
    
    

    没有人订阅此流。除非存在该流的订阅服务器,否则不会执行该流。 您是否已将一行代码添加到此代码中,您将看到 defer() 正在执行:

    
        documentRepository.getDocuments(...)
                          .map { ...}
                          .subscribe()