多次更新对象时,只更新最后一个对象。我希望执行所有更新操作
while updating object several times, only last object is updated. I want all update operations to be executed
我是 vert.x 框架和 rx-java 的新手。我目前正在与 mongoDB 合作。问题是我必须多次更新同一个对象,但只执行最后一次更新。下面提供了代码。 findByProductId 方法 returns 必需的对象。如果此 ID 的对象在数据库中尚不存在,则检查可能会 return 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)
})
})
}
我发现这段代码存在一些问题:
- 无故使用 flatMap()。检查 flatMap() 在这个答案中是如何工作的:When do you use map vs flatMap in RxJava?
- 在 Kotlin 中使用
!!
,又名 bang-bang。通常这意味着你并不真正理解你的 API 是如何工作的,并且最终会导致 NullPointer
- 我猜
updateWithoutDuplicate()
是 MongoDB 的目标,尽管您没有 post 实际代码。但是,看到你如何在没有任何回调或 await()
的情况下调用它,我假设你希望它同步运行。考虑到您同时使用 Vert.x 和 MongoDB,更改是异步的。
我是 vert.x 框架和 rx-java 的新手。我目前正在与 mongoDB 合作。问题是我必须多次更新同一个对象,但只执行最后一次更新。下面提供了代码。 findByProductId 方法 returns 必需的对象。如果此 ID 的对象在数据库中尚不存在,则检查可能会 return 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)
})
})
}
我发现这段代码存在一些问题:
- 无故使用 flatMap()。检查 flatMap() 在这个答案中是如何工作的:When do you use map vs flatMap in RxJava?
- 在 Kotlin 中使用
!!
,又名 bang-bang。通常这意味着你并不真正理解你的 API 是如何工作的,并且最终会导致 NullPointer - 我猜
updateWithoutDuplicate()
是 MongoDB 的目标,尽管您没有 post 实际代码。但是,看到你如何在没有任何回调或await()
的情况下调用它,我假设你希望它同步运行。考虑到您同时使用 Vert.x 和 MongoDB,更改是异步的。