我是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)
})
})
}
答案 0 :(得分:1)
此代码有一些问题,我可以看到:
!!
(又名bang-bang)。通常,这意味着您不太了解API的工作原理,最终会导致NullPointer出现updateWithoutDuplicate()
是进入MongoDB的那个,尽管您没有向其中发布实际代码。但是,看看您如何在没有任何回调或await()
的情况下调用它,我假设您希望它具有同步行为。考虑到您同时使用Vert.x和MongoDB,更改是异步的。