调用异步方法并获取该异步方法返回值

场景:比如有两个类:A,B,A类调用B类的异步方法asyncMethod,并获取B类该异步方法返回的结果XxDto。

为什么会有这种场景需求:可能A、B类的业务需要花费的时间较长,为了节约时间故有该设计。如:B类中需要执行大量业务逻辑,或者调用三方接口,如果不采用异步,那么A等待B完成业务后再继续执行A剩下的业务,花费的时间会长;那如果采用了异步,A类又需要获取B类异步方法的返回结果,因此有该设计。在A异步调用B方法时,继续执行A的业务逻辑,接着再去拿B的结果去处理即可。

A类代码如下:

import org.springframework.beans.factory.annotation.Autowired;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

@Component
public class A {
    @Autowired
    private B b;

    public void aMethod() throws ExecutionException, InterruptedException {
        // 调用B类的异步方法
        Future<XxDto> xxDtoFuture = b.asyncMethod();

        // 执行A类的业务代码

        // 拿出异步方法的返回值,并根据业务作对应处理
        XxDto xxDto = xxDtoFuture.get();
    }
}

B类代码如下:

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;

import java.util.concurrent.Future;

@Component
public class B {
    @Async
    public Future<XxDto> asyncMethod() {
        // 执行业务代码

        // 返回异步结果
        return AsyncResult.forValue(new XxDto());
    }
}

XxDto代码如下:

import lombok.Data;

@Data
public class XxDto {
}

核心就是在B类异步方法中使用 AsyncResult.forValue(new XxDto()) 来返回一个 Future<XxDto> 的对象,A类调用B的异步方法会有一个 Future<XxDto> 对象的返回值,在调用该对象的get()方法获取到数据。如果A类调用 Future<XxDto> 对象的 get() 方法时,此时B类还没有完成业务,那么就会A类就会阻塞等待B类返回结果后才会执行 get() 方法后的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中,异步函数的返回值通常无法直接获取。这是因为异步函数的执行是非阻塞的,代码不会等待异步操作完成再继续执行,而是会继续向下执行。因此,如果直接返回异步函数中的值,往往会得到undefined或初始值,而不是异步操作完成后的值。 有几种常见的方式可以获取JavaScript异步函数的返回值: 1. 回调函数:可以通过在异步函数中传入回调函数,然后在异步操作完成后调用回调函数并将结果作为参数传递给回调函数。这样,在回调函数中就可以拿到异步函数的返回值了。 2. Promise对象:Promise是一种用于处理异步操作的对象。异步函数可以返回一个Promise对象,并在异步操作完成后通过resolve()方法传递返回值。然后可以使用then()方法来处理异步操作的返回值。 3. async/await:async/await是ES2017引入的一种处理异步操作的语法糖。通过在异步函数前面添加async关键字,就可以在函数内部使用await关键字来等待异步操作的完成,并获取返回值。需要注意的是,使用async/await时,异步函数返回的是一个Promise对象,需要通过then()方法或者再次使用async/await来获取最终的返回值。 4. Generator函数:Generator函数是一种特殊的函数,可以通过yield关键字来实现暂停和恢复函数执行的功能。可以将异步操作封装在Generator函数中,并通过yield关键字来获取异步操作的返回值。 总结一下,获取JavaScript异步函数的返回值可以使用回调函数、Promise对象、async/await和Generator函数。具体使用哪种方法要根据具体的场景和需求来决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值