在 Java 中为异步调用添加超时

Posted

技术标签:

【中文标题】在 Java 中为异步调用添加超时【英文标题】:Adding Timeout to Asynchronous Calls in Java 【发布时间】:2014-05-27 01:07:53 【问题描述】:

不仅仅是一个 Firebase 问题,而是我正在使用 Firebase 从 android 向后端发布帖子并运行 10 次,每秒一次。

Firebase ref = new Firebase(URL);
ref.child("Time").setValue(Currentime());

但是,这是一个异步调用,当我放置一个 while 循环时:

while (time_now < time_start + 10 seconds) 
     Firebase ref = new Firebase(URL);
     ref.child("Time").setValue(Currentime());

似乎先运行 while 循环,然后在最后运行约 10 个 Firebase 调用。有没有办法添加超时,以便在调用下一个异步调用之前强制异步 (Firebase) 调用运行一秒钟?

【问题讨论】:

你能澄清一下你在找什么吗?具体来说,您是说循环非常快速地连续运行大约 10 次(例如,在一秒钟内)并且您希望它们以一秒钟的间隔更慢地启动? 【参考方案1】:

如果您查看Java example on the Firebase web site,您会发现它有一个doTransactions 方法和一个onComplete 方法:

Firebase countRef = new Firebase(URL);
Transaction.Handler handler = new Transaction.Handler() 
    @Override
    public Transaction.Result doTransaction(MutableData currentData) 
        // set the new time
        ...
    

    @Override
    public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) 
        if (error != null) 
            ...
         else 
            if (!committed) 
                ...
             else 
                // transaction committed, do next iteration
                ...
            
            ...
        
    
);
countRef.runTransaction(handler);

所以你可以在doTransaction 方法中设置新时间:

// set the new time
currentData.setValue(time_now);
return Transaction.success(currentData);

然后在onComplete 方法中开始下一次迭代。

// transaction committed, do next iteration
if (time_now < time_start + 10 seconds) 
    countRef.runTransaction(handler);

【讨论】:

以上是关于在 Java 中为异步调用添加超时的主要内容,如果未能解决你的问题,请参考以下文章

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调

尽管使用 done,Mocha 在 Before 钩子中调用异步承诺链超时

jQuery Validator异步调用[重复]

微信超时5s,调用客服接口异步回复消息(PHP)

从递归超时调用异步 mongodb 函数,我想是上下文错误