从 Flow 接收对象后,如何 return 暂停函数中的对象?
how to return an object in a suspended function after receiving the object from a Flow?
我想知道是否有一种方法可以等待流程完成并 return 挂起函数中的结果。 transactionRepository.getAll(accountId)
return一个交易流
override suspend fun getAccount(accountId: Int): Account {
val account = Account(accountRepository.get(accountId))
transactionRepository.getAll(accountId).mapIterable {
val transaction = Transaction(it)
val category = Category(categoryRepository.get(it.categoryId))
transaction.category = category
transaction.account = account
return@mapIterable transaction
}.collect {
account.transactions = it
}
//TODO: How can i return an account after the flow has been executed?
}
我的存储库中定义的 getAll 函数:
fun getAll(accountId: Int): Flow<List<DatabaseTransaction>>
假设您只需要流程返回的第一个值,并且它是 List<Transaction>
,您可以使用 first()
。但我只是猜测,因为我不知道 getAll()
returns 是什么,我也不熟悉 mapIterable
.
override suspend fun getAccount(accountId: Int): Account {
val account = Account(accountRepository.get(accountId))
val transactionsFlow: Flow<List<Transaction>> = transactionRepository.getAll(accountId).mapIterable {
val transaction = Transaction(it)
val category = Category(categoryRepository.get(it.categoryId))
transaction.category = category
transaction.account = account
return@mapIterable transaction
}
account.transactions = transactionsFlow.first()
return account
}
你可以做两件事
第一个是在流程上使用 .toList()
,我认为它可以为您提供所需的列表,然后您可以在该列表上执行正常的 for 循环来设置数据
val transactions = transactionRepository.getAll(accountId).toList()
transactions.forEach{
val transaction = Transaction(it)
val category = Category(categoryRepository.get(it.categoryId))
transaction.category = category
transaction.account = account
}
account.transactions = transactions
其次是 return 像往常一样收款后的帐户。
val account = Account(accountRepository.get(accountId))
transactionRepository.getAll(accountId).mapIterable {
val transaction = Transaction(it)
val category = Category(categoryRepository.get(it.categoryId))
transaction.category = category
transaction.account = account
return@mapIterable transaction
}.collect {
account.transactions = it
}
return account
看我做的这个例子
我想知道是否有一种方法可以等待流程完成并 return 挂起函数中的结果。 transactionRepository.getAll(accountId)
return一个交易流
override suspend fun getAccount(accountId: Int): Account {
val account = Account(accountRepository.get(accountId))
transactionRepository.getAll(accountId).mapIterable {
val transaction = Transaction(it)
val category = Category(categoryRepository.get(it.categoryId))
transaction.category = category
transaction.account = account
return@mapIterable transaction
}.collect {
account.transactions = it
}
//TODO: How can i return an account after the flow has been executed?
}
我的存储库中定义的 getAll 函数:
fun getAll(accountId: Int): Flow<List<DatabaseTransaction>>
假设您只需要流程返回的第一个值,并且它是 List<Transaction>
,您可以使用 first()
。但我只是猜测,因为我不知道 getAll()
returns 是什么,我也不熟悉 mapIterable
.
override suspend fun getAccount(accountId: Int): Account {
val account = Account(accountRepository.get(accountId))
val transactionsFlow: Flow<List<Transaction>> = transactionRepository.getAll(accountId).mapIterable {
val transaction = Transaction(it)
val category = Category(categoryRepository.get(it.categoryId))
transaction.category = category
transaction.account = account
return@mapIterable transaction
}
account.transactions = transactionsFlow.first()
return account
}
你可以做两件事
第一个是在流程上使用 .toList()
,我认为它可以为您提供所需的列表,然后您可以在该列表上执行正常的 for 循环来设置数据
val transactions = transactionRepository.getAll(accountId).toList()
transactions.forEach{
val transaction = Transaction(it)
val category = Category(categoryRepository.get(it.categoryId))
transaction.category = category
transaction.account = account
}
account.transactions = transactions
其次是 return 像往常一样收款后的帐户。
val account = Account(accountRepository.get(accountId))
transactionRepository.getAll(accountId).mapIterable {
val transaction = Transaction(it)
val category = Category(categoryRepository.get(it.categoryId))
transaction.category = category
transaction.account = account
return@mapIterable transaction
}.collect {
account.transactions = it
}
return account
看我做的这个例子