如何在等待回调中保存对象?

Posted

技术标签:

【中文标题】如何在等待回调中保存对象?【英文标题】:How can I save aside an object in awaitility callback? 【发布时间】:2016-09-11 08:32:27 【问题描述】:

我的代码调用服务器并获得old-response

然后我想进行轮询,直到我得到来自服务器的不同响应(又名new-response)。

我使用while循环我可以持有new-response并在轮询后使用它。

如果我使用awaitility,如何轻松获得new-response

这是我的代码:

public Version waitForNewConfig() throws Exception 
    Version oldVersion = deploymentClient.getCurrentConfigVersion(appName);
    await().atMost(1, MINUTES).pollInterval(5, SECONDS).until(newVersionIsReady(oldVersion));
    Version newVersion = deploymentClient.getCurrentConfigVersion(appName);



private Callable<Boolean> newVersionIsReady(Version oldVersion) 
    return new Callable<Boolean>() 
        public Boolean call() throws Exception 
            Version newVersion = deploymentClient.getCurrentConfigVersion(appName);

            return !oldVersion.equals(newVersion);
        
    ;

【问题讨论】:

【参考方案1】:

您可以使用ConditionFactory.until(Callable[T], Predicate[T])

例如:

Callable<MyObject> supplier = () -> queryForMyObject();
Predicate<MyObject> predicate = myObject -> myObject.getFooCount() > 3;

MyObject myObject = Awaitility.await()
   .atMost(1, TimeUnit.MINUTE)
   .pollInterval(Duration.ofSeconds(5))
   .until(supplier, predicate);

doStuff(myObject);

【讨论】:

【参考方案2】:

一种方法是制作一个专门的 Callable 实现来记住它:

public Version waitForNewConfig() throws Exception 
    NewVersionIsReady newVersionIsReady = new NewVersionIsReady(deploymentClient.getCurrentConfigVersion(appName));
    await().atMost(1, MINUTES).pollInterval(5, SECONDS).until(newVersionIsReady);

    return newVersionIsReady.getNewVersion();


private final class NewVersionIsReady implements Callable<Boolean> 
    private final Version oldVersion;
    private Version newVersion;

    private NewVersionIsReady(Version oldVersion) 
        this.oldVersion = oldVersion;
    

    public Boolean call() throws Exception 
        Version newVersion = deploymentClient.getCurrentConfigVersion(appName);

        return !oldVersion.equals(newVersion);
    

    public Version getNewVersion() 
        return newVersion;
    

另一种是将其存储在容器中(以我使用数组为例)

public Version waitForNewConfig() throws Exception 
    Version[] currentVersionHolder = new Version[1];
    Version oldVersion = deploymentClient.getCurrentConfigVersion(appName);
    await().atMost(1, MINUTES).pollInterval(5, SECONDS).until(() -> 
        Version newVersion = deploymentClient.getCurrentConfigVersion(appName);
        currentVersionHolder[0] = newVersion;
        return !oldVersion.equals(newVersion);
    );

    return currentVersionHolder[0];

如果你还没有使用 java 8,你也可以使用匿名内部类。

【讨论】:

以上是关于如何在等待回调中保存对象?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery:在返回之前等待回调

如何使用回调在任何函数中调用异步等待方法

如何等待 API 回调完全渲染组件?

如何在 koa 中发送 HTTP 响应之前等待 url 回调?

如何在单元测试之前等待组件的挂载回调中的异步调用完成?

如何等待传递给 Flask-SocketIO 的 emit() 的回调?