如何等待超时的承诺?

Posted

技术标签:

【中文标题】如何等待超时的承诺?【英文标题】:How to await for a Promise with a timeout? 【发布时间】:2013-01-24 17:16:07 【问题描述】:

我认为,以下内容将永远等待。如何指定超时?

await(new Job<Long>() 
    @Override
    public Long doJobWithResult() throws Exception 
        ...
    
.now());

【问题讨论】:

【参考方案1】:

实现杀死线程的超时实际上是一件非常困难的事情,因为您需要使用 Thread.stop() 或其他类似的东西,当它死亡时可能无法清理。更好的方法是让超时在您的长期工作中设置一个标志,使其停止处理并更快地返回。或者,您让长时间的工作继续进行,并在超时时呈现响应。

这是一个满足你要求的测试用例:

https://github.com/playframework/play/blob/1.3.x/samples-and-tests/just-test-cases/app/controllers/WithContinuations.java#L73

public static void waitWithTimeout() 
        Promise<String> task1 = new jobs.DoSomething(100).now();
        Promise<String> task2 = new jobs.DoSomething(2000).now();
        Either<List<String>,Timeout> r = await(Promise.waitEither(Promise.waitAll(task1, task2), Timeout(300)));

        for(Timeout t : r._2) 

            StringBuilder result = new StringBuilder();

            if(task1.isDone()) 
                result.append(" + Task1 -> " + task1.getOrNull());
            

            if(task2.isDone()) 
                result.append(" + Task2 -> " + task2.getOrNull());
            

            renderText("Timeout! Partial result is " + result);
        

        renderText("Fail!");
    

【讨论】:

这个方法await()属于哪个包和类? 它是 Controller 类的一部分——但你不会轻易在 src 中找到它——它是 play1 类加载器的一部分。更多信息:playframework.com/documentation/1.2/…【参考方案2】:

指定动作之前的时间。所以对于 30 秒超时:

await("30s", new Job<Long>() 
    @Override
    public Long doJobWithResult() throws Exception 
        ...
    
.now());

【讨论】:

无法在 Play 1.2.4-mbknor3 中编译。这是在play 1.2.5中添加的还是什么?你确定它可以编译吗? 是的,很糟糕 - 见其他答案。 不 - 其他答案也不起作用。有兴趣看看你想出什么,请回帖

以上是关于如何等待超时的承诺?的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Functions for Firebase onWrite 超时

如何在android下采用相对时间,实现超时等待的功能

如何区分等待(长时间超时)退出通知或超时?

如何解决高并发,连接等待超时的异常

嵌套承诺 - 摩卡 - 超过超时

返回承诺时摩卡超过2000毫秒超时[重复]