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