簡體   English   中英

協程中的 Job.join() 不等待任務先完成

[英]Job.join() in coroutine is not waiting for task to finish first

每當購物清單中的最后一項被添加到購物車時,我在Jetpack Compose UI 中有邏輯檢查這一點,並在所有項目都已添加到購物車時顯示一個警告對話框。 我想等到數據庫更新后再檢查是否所有項目都在每次將項目添加到購物車時都在購物車中,但是在數據庫更新操作有機會完成之前立即顯示警報對話框,即使在使用Job.join()時也是如此. Job.join() 代碼可能有什么問題?

@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)
    }
}

視圖模型

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)
        }
}

你可以把它留在那里; 您不需要在此 function 中引用viewModelScope

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM