You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用future::resolved判断promises::future_promises是否已完成?

检查promises::future_promise是否完成的方法

你遇到的问题是因为promises::future_promise()返回的是promise对象,而非future包的Future对象。直接用future::resolved()判断会误判——它检查的是promise自身的状态(promise创建后立即处于等待回调的"resolved"状态),而非底层异步任务的执行状态。

下面是两种可行的解决方法:

方法一:提取底层Future对象进行检查

future_promise内部会创建一个底层的Future对象,你可以通过.future属性获取它,再用future::resolved()判断任务是否完成:

future::plan(future::multisession)

f <- function() {
  Sys.sleep(10)
  return(TRUE)
}

# 创建future_promise
x <- promises::future_promise({
  f()
}) 

# 提取底层Future对象
x_underlying_future <- x$.future

# 检查任务状态(初始为FALSE,10秒后变为TRUE)
future::resolved(x_underlying_future)

# 轮询等待的示例
while (!future::resolved(x_underlying_future)) {
  cat("异步任务仍在执行...\n")
  Sys.sleep(1)
}
cat("异步任务已完成!\n")

方法二:使用promise的回调机制(更符合异步编程范式)

如果不需要主动轮询,而是想在任务完成后自动执行操作,可以用promises::then()注册回调函数,避免轮询开销:

future::plan(future::multisession)

f <- function() {
  Sys.sleep(10)
  return(TRUE)
}

# 创建future_promise并注册完成回调
x <- promises::future_promise({
  f()
}) %>%
  promises::then(function(result) {
    cat("异步任务完成,结果:", result, "\n")
    # 这里编写任务完成后的处理逻辑
  })

# 主程序可以继续执行其他操作,无需阻塞等待
cat("主程序继续运行...\n")

内容的提问来源于stack exchange,提问作者Julien Navarre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:01:02