协程中的Job.join()没有等待task先完成



每当将购物清单中的最后一项添加到购物车中时,我在Jetpack ComposeUI中设置了检查该项的逻辑,如果所有项目都已添加到购物车中,则显示一个警告对话框。我想等到数据库更新后再检查是否所有的项目都在购物车中,每次将一个项目添加到购物车中,但是在数据库更新操作有机会先完成之前立即显示警报对话框,即使使用Job.join()。代码可能有什么问题?

<刀/strong>

@Update(entity = ShoppingListItemEntity::class)
suspend fun updateShoppingListItem(item: ShoppingListItemEntity): Int

override suspend fun updateShoppingListItem(shoppingListItem: ShoppingListItem): Int {
return shoppingListItemDao.updateShoppingListItem(
shoppingListItemMapper.mapToEntity(shoppingListItem)
)
}

用例

class UpdateShoppingListItemUseCase@Inject constructor(
private val shoppingListItemsRepository: ShoppingListItemsRepository
) {
suspend operator fun invoke(shoppingListItem: ShoppingListItem): Int {
return shoppingListItemsRepository.updateShoppingListItem(shoppingListItem)
}
}

ViewModel

private fun updateShoppingListItemInDb(item: ShoppingListItem) {
viewModelScope.launch {
val job = launch {
updateShoppingListItemUseCase(item)
}
job.join()
//This line runs immediately
setStateValue(IS_CHECK_IF_LAST_ITEM_IN_SHOPPING_CART, true) 
}
}

立即执行async await:

private fun updateShoppingListItemInDb(item: ShoppingListItem) {
viewModelScope.launch {
val asyncTask = async {
updateShoppingListItemUseCase(item)
}
val rowsAffected = asyncTask.await()
if(rowsAffected == 1) {
//This line executes immediately 
setStateValue(IS_CHECK_IF_LAST_ITEM_IN_SHOPPING_CART, true)
}
}
}

您需要编写类似

的内容
private suspend fun updateShoppingListItemInDb(item: ShoppingListItem) = coroutineScope {
val asyncTask = async {
updateShoppingListItemUseCase(item)
}
val rowsAffected = asyncTask.await()
if(rowsAffected == 1) {
//This line executes immediately 
setStateValue(IS_CHECK_IF_LAST_ITEM_IN_SHOPPING_CART, true)
}
}

你可以不去管它;你不需要在这个函数中引用viewModelScope

最新更新