在 R/Shiny 中,我们可以使用 library(promises) 和 library(future) 来异步处理事件。但我似乎无法找到一种方法将它与 library(httr) 结合起来做类似于fetch/await/async的事情,从而设置一个 promise,当 httr 请求成功时解决。是否可以在 R/Shiny 中设置一个在 httr 请求成功时解决的承诺?或者您只能执行以下操作,首先检查是否会出现 http 错误?
library(shiny)
library(promises)
library(future)
plan(multisession)
ui <- fluidPage(
textOutput("success"),
textOutput("fail")
)
server <- function(input, output, session) {
output$success <- renderText({
# 201 success command should return
get_command_1 <- httr::GET("http://httpbin.org/status/201")
print(http_error(get_command_1))
if(http_error(get_command_1)) {
future(get_command_1) %...>%
httr::content("parsed")
}
else {
paste0(get_command_1$url, " failed")
}
})
output$fail <- renderText({
# but not 500 error command
get_command_2 <- httr::GET("http://httpbin.org/status/500")
print(http_error(get_command_2))
if(http_error(get_command_2)) {
future(get_command_2) %...>%
httr::content("parsed")
}
else {
paste0(get_command_2$url, " failed")
}
})
}
shinyApp(ui = ui, server = server)