我在看promises
包,但我不知道如何真正让promise做任何事情。所有可用的阻塞机制(如promise_all
(都返回一个promise,而且似乎没有明显的方法让promise首先执行。例如,给定以下代码片段:
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"
如何实际调用promise链?
奇怪的是,如果我将第一个promise更改为future_promise
,并像中那样添加一个运行循环
while(!done) {
later::run_now()
Sys.sleep(0.01)
}
promise链执行正确。不过,这与常规承诺不起作用。
我错过了什么?这个系统似乎缺少一个执行人,但我从哪里得到执行人?我在包本身中看不到任何东西,也没有用户可见的API来查询我能看到的承诺。
原来我使用API不正确。promise表达式应该调用continuation回调。我错过了那个细节。所以这是有效的:
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)
}