Как я могу отправить запрос GET, не дожидаясь ответа - PullRequest
2 голосов
/ 29 марта 2019

Я пытаюсь выполнить GET-запрос внутри глянцевого приложения, но я не хочу ждать ответа, так как обработка займет довольно много времени, и мне действительно не нужен ответ внутри блестящего приложения, хотяКод статуса был бы хорош, но не обязателен.

Или, может быть, есть функция, которая отправляет асинхронный запрос?Например, обернуть весь GET в будущее / обещание?

В настоящее время у меня есть следующее поле наблюдающего в моем блестящем приложении:

  observeEvent(input$import, {
    httr::GET(url = "https://someurl/that/takes/a/long/time")
  })

Подходит ли curl_fetch_multi из пакета curl для этой задачи?

1 Ответ

2 голосов
/ 25 апреля 2019

Вот способ выполнить GET асинхронно и без блокировки внутри сеанса (наблюдатель ничего не возвращает):

library(shiny)
library(future)
library(promises)
library(future.callr)
library(httr)

plan(callr)

queryGoogle <- function(queryString) {
  myResponse <- httr::GET("http://google.com/", path = "search", query = list(q = queryString))
  return(myResponse)
}

ui <- fluidPage(
  br(),
  textOutput("time_output"),
  br(),
  textInput(inputId="query_input", label = NULL, value = "", placeholder = "Search google..."),
  actionButton("import", "Query"),
  hr(),
  textOutput("query_output")
)

server <- function(input, output, session) {
  futureData <- reactiveValues(response = NULL)

  observeEvent(input$import, {
    myFuture <- future({
      queryGoogle(isolate(input$query_input))
    })

    then(
      myFuture,
      onFulfilled = function(value) {
        futureData$response <- value
      },
      onRejected = NULL
    )
    return(NULL)
  })

  output$query_output <- renderPrint({
    req(futureData$response)
  })

  time <- reactive({
    invalidateLater(500, session)
    Sys.time()
  })

  output$time_output <- renderText({ paste("Something running in parallel:", time()) })
}

shinyApp(ui, server)

Это небольшая модификация моего ответа здесь.

...