1

我在看promises,但我不知道如何真正让承诺做任何事情。所有可用的阻塞机制(如promise_all)都返回一个承诺,而且似乎没有明显的方法让承诺首先执行。例如,给定以下代码片段:

library(promises)

p <- promise(~ {
  print("executing promise")
}) %>% then(~ {
  print("promise is done")
})

print("we are here")

done <- FALSE
all_promises <- promise_all(p) %>% then(~ {
  print("all promises done")
  done <<- TRUE
})

# output:
# [1] "executing promise"
# [1] "we are here"

我如何实际调用承诺链?

奇怪的是,如果我将第一个承诺更改为 afuture_promise并添加一个运行循环,如

while(!done) {
  later::run_now()
  Sys.sleep(0.01)
}

承诺链正确执行。但是,这不适用于常规承诺。

我错过了什么?看来系统缺少执行者,但是我在哪里获得执行者?我在包本身中看不到任何内容,并且没有用户可见的 API 用于查询我可以看到的承诺。

4

1 回答 1

2

事实证明我错误地使用了 API。Promise 表达式应该调用延续回调。我错过了那个细节。所以这有效:

library(promises)

p <- promise(~ {
  print("executing promise")
  resolve(1)
}) %>% then(~ {
  print("promise is done")
})

print("we are here")

done <- FALSE
all_promises <- promise_all(p) %>% then(~ {
  print("all promises done")
  done <<- TRUE
})

while(!done) {
  later::run_now()
  Sys.sleep(0.1)
}
于 2021-07-01T13:20:59.007 回答