当前位置: 首页 > 知识库问答 >
问题:

Spring将在用户返回数据之前等待其完成任务

穆招
2023-03-14

我正在尝试使用返回Mono的Spring反应器webclient执行多个HTTP调用。我正在使用Mono.block()等待所有monos完成。这不是等待直到订阅()完成。

public class UserValidator {

    public Mono<User> getUserSummary(int userId) {
        User user = new User();

        // First Mono
        Mono<Address> address = WebClientUtil.mono(userId, Address.class);
        address.subscribe(adrs -> updateAddress(adrs, user));

        // Second Mono
        Mono<Education> education = WebClientUtil.mono(userId, Education.class);
        education.subscribe(edcn -> updateEducationDeatils(edcn, user));

        Mono.when(address, education).block(); // Blocking the monos to complete

        // Intermittently returning the incomplete data ******************
        return Mono.just(user);
    }

    private void updateAddress(Address adrs, User user) {
        // Do some validations
        // Validations takes 5 to 10 seconds
        user.setAddress(adrs);
    }

    private void updateEducationDeatils(Education education, User user) {
        // Do some validations
        // Validations takes 5 to 10 seconds
        user.setEducation(education);
    }

}

有人能帮我解决这个问题,在subscribe()完成后返回更新的用户对象吗?

共有1个答案

谭越
2023-03-14

如果返回值也是Mono,则不应阻止Mono,而是使用zip

    public Mono<User> getUserSummary(int userId) {
        Mono<Address> addressMono = WebClientUtil.mono(userId, Address.class);
        Mono<Education> educationMono = WebClientUtil.mono(userId, Education.class);

        return Mono.zip(addressMono, educationMono, (address, education) -> {
          User user = new User();
          user.setAddress(address);
          user.setEducation(education);
        });
    }

此外,请确保您的验证不会阻止任何一个。

 类似资料:
  • 问题内容: 我有以下 我有一个运行一些ajax的函数,然后根据ajax是否成功返回true或false。我从代码的多个位置调用了这个ajax函数。 因为该函数在ajax完成之前结束,所以它总是返回false。如何避免这种情况? 我读到一些建议我在函数中执行的操作,然后将和函数移至我的和函数。但是,在我的方法中,我进行了大量的计算。很多代码。因此,问题在于,如果我将功能移至其他功能,那么我将复制一堆

  • 我对这段代码有一个问题,其中语句是在函数之前触发的,它返回0而不是正确的值。有没有办法在返回之前强制完成?我知道这是一个逻辑问题,因为如果我删除处的注释,它就可以正常工作。 如何在不使用或应用程序中的任何其他类型的超时?原始代码: 编辑代码: 这是StorageInformation类 从接口调用StorageInformation 我还尝试了r2rek的解决方案,得到了相同的结果 欢迎提出任何问

  • 我仍在为承诺而挣扎,但多亏了这里的社区,我取得了一些进步。 我有一个简单的JS函数,它查询解析数据库。它应该返回结果数组,但显然由于查询的异步性质(因此有承诺),函数在结果之前返回,给我留下一个未定义的数组。 我需要做什么才能让这个函数等待承诺的结果呢? 这是我的代码:

  • 问题内容: 这是我的情况: 在this.handleFormSubmit()上,我正在执行this.setState() 在this.handleFormSubmit()内部,我正在调用this.findRoutes(); -取决于this.setState()的成功完成 this.setState(); 在this.findRoutes被调用之前没有完成… 在调用this.findRoutes(

  • TL;DR:我希望能够等待所有的期货,但是一旦它结束,就得到每个可赎回的返回值。 假设我使用一个执行器运行多个Callable。如果我有一个未来列表,是否有任何优雅的方法可以获得任何已完成任务的回报值,然后以相同的方式等待任务的其余部分?

  • 问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。