问题描述
在使用WebFlux
时遇到一个很奇怪的问题,先调用禁用账号接口,接着在进行查询该数据,结果页面显示数据未改变,在点一次时页面数据才刷新。即连续点两次查询接口,才能看到修改后的数据。
相关代码
前端
const disableAccount = (record) => {
if (record && record.accountId) {
disableAccountApi(record.accountId).then(() => {
query();
});
}
};
后端
@PostMapping("/{id}/disable")
public R<Object> disableAccount(@PathVariable("id") String id){
accountService.disableAccount(id);
return R.message("已禁用该账号");
}
public void disableAccount(String id) {
accountRepo.findById(id)
.flatMap(accountDO -> {
accountDO.disabled();
return accountRepo.save(accountDO);
}).subscribe();
}
寻找原因
刚开始的时候以后时前端页面没有刷新的原因,尝试使用forceUpdate
强制更新页面。发现没什么效果。后面通过使用onUpdated
打印页面更新时的数据,发现和数据库不一致,即数据并未更新。由此想到WebFlux
的Mono\Flux
运行在不同的线程上。上面那种直接在方法中订阅,实际上接口返回之后,订阅的Mono
还在执行。所以修改代码,不直接订阅Mono\Flux
,将Mono\Flux
作为返回值返回,就可以了
改正后的代码
@PostMapping("/{id}/disable")
public Mono<R<Object>> disableAccount(@PathVariable("id") String id){
return accountService.disableAccount(id).thenReturn(R.message("已禁用该账号"));
}
public Mono<AccountDO> disableAccount(String id) {
return accountRepo.findById(id)
.flatMap(accountDO -> {
accountDO.disabled();
return accountRepo.save(accountDO);
});
}