在多次更新对象时,仅更新最后一个对象。我要执行所有更新操作

时间:2018-06-23 14:19:08

标签: kotlin rx-java vert.x

我是vert.x框架和rx-java的新手。我目前正在使用mongoDB。问题是我必须多次更新同一对象,但是只能执行最后一次更新。下面提供了代码。 findByProductId方法返回必需的对象。检查已完成,因为如果此ID的对象在db中还没有,则返回false。

fun cancelProductStateCountList(inventoryList: List<Inventory>) : Observable<List<ProductState>> {
    return Observable.create({ event ->
        val count = inventoryList.count()
        var counter = 0
        var itemCounter = 0
        val result = mutableListOf<ProductState>()
        var searchingId = ""
        Observable
                .fromArray(inventoryList)
                .flatMapIterable({
                    items -> items
                })
                .flatMap({
                    item ->
                    searchingId = item.productId!!
                    findByProductId(item.productId!!)
                })
                .flatMap ({
                    if(it is ProductState){
                        if(inventoryList[itemCounter].operation == InventoryOperation.HOLD.value()){
                            var quantityAvailable: Double = it.quantity!!
                            var quantityHold: Double = it.hold!!
                            quantityAvailable += inventoryList[itemCounter].quantity!!
                            quantityHold -= inventoryList[itemCounter].quantity!!
                            it.quantity = quantityAvailable
                            it.hold = quantityHold
                            itemCounter ++
                            updateWithoutDuplicate(it)
                        } else {
                            var quantityAvailable: Double = it.quantity!!
                            quantityAvailable += inventoryList[itemCounter].quantity!!
                            it.quantity = quantityAvailable
                            itemCounter ++
                            updateWithoutDuplicate(it)
                        }
                    } else {
                        Observable.just("")
                    }

                })
                .subscribe({
                    if(it is ProductState){
                        result.add(it)
                        counter ++
                        if (counter == count) {
                            event.onNext(result)
                        }
                    } else {
                        event.onError(NotExistsException("productId", searchingId))
                    }

                }, {
                    event.onError(it)
                })

    })
}

1 个答案:

答案 0 :(得分:1)

此代码有一些问题,我可以看到:

  1. 无任何理由地使用flatMap()。在以下答案中检查flatMap()的工作方式:When do you use map vs flatMap in RxJava?
  2. 在科特林使用!!(又名bang-bang)。通常,这意味着您不太了解API的工作原理,最终会导致NullPointer出现
  3. 我想updateWithoutDuplicate()是进入MongoDB的那个,尽管您没有向其中发布实际代码。但是,看看您如何在没有任何回调或await()的情况下调用它,我假设您希望它具有同步行为。考虑到您同时使用Vert.x和MongoDB,更改是异步的。