Я экспериментировал с обещаниями, и, как я понимаю, как указывалось в этом выпуске , асинхронный процесс, выполняющийся для того же пользователя, должен блокировать выполнение всех других внутрисессионных действий.Однако это не кажется универсальным принципом.
В приведенном ниже примере приложения у меня есть искусственно нарисованная операция построения и некоторые другие элементы, чтобы увидеть, как они взаимодействуют.Одним из этих элементов является пара downloadButton
/ downloadHandler
.Пока выполняется асинхронная операция, все еще можно нажать downloadButton
и получить вывод, что было неожиданно для меня.Мои вопросы:
- Могу ли я прекратить загрузку активным во время выполнения асинхронного процесса downloadHandler?
- Почему
downloadHandler
особенный?
<code>
library(future)
library(promises)
library(shiny)
plan(multisession)</p>
<p>server = function(input, output) {
# slow async plot
output$slow_plot <- renderPlot({
input$slow_plot_button
future({
print('I am slow')
Sys.sleep(10)
runif(20)
}) %...>% plot(.)
})
# fast normal plot
output$fast_plot = renderPlot({
print('I am fast')
input$fast_plot_button
plot(runif(20))
})
# something that has no UI output
observeEvent(input$non_ui_update,{
print('Button press yay!')
})
# trigger happy downloadHandler
output$download = downloadHandler('file',
content = function(file){
cat('is a file',file = file)
})}</p>
<p>ui = fluidPage(
titlePanel("Async test"),
sidebarLayout(
sidebarPanel(
actionButton('slow_plot_button','slow plot button'),
actionButton('fast_plot_button','fast plot button'),
actionButton('non_ui_update','non ui update'),
downloadButton('download','download')
),
mainPanel(
plotOutput("slow_plot"),
plotOutput("fast_plot")
)
)
)</p>
<p>shinyApp(ui,server)
Редактировать: Удалена дополнительная информация о загрузке. Кнопка сначала загружает всю страницу, поскольку она не является неотъемлемой частью вопроса