Как на самом деле вызывать обещания?

Я смотрел на promisespackage , но я не могу понять, как заставить обещания что-либо делать. Все доступные механизмы блокировки (например, 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"

как на самом деле вызвать цепочку обещаний?

Как ни странно, если я изменю первое обещание на future_promise и добавьте цикл выполнения, как в

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

цепочка обещаний выполняется правильно. Однако это не работает с обычным обещанием.

Что мне не хватает? Вроде в системе не хватает исполнителя, но где взять исполнителя? Я не вижу ничего в самом пакете, и нет видимого для пользователя API для запросов обещаний, которые я могу видеть.

1 ответ

Оказывается, я неправильно использовал API. Выражение обещания должно вызывать обратный вызов продолжения. Я упустил эту деталь. Итак, это работает:

      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)
}
Другие вопросы по тегам