Пакет Promises
A Promise представляет собой значение, которое станет доступным позднее. Promise могут быть выполнены со значением или отклонены. Любое количество обработчиков функций может быть добавлено к Promise, чтобы быть вызванными, когда Promise выполняется или отклоняется. Эти обработчики также упакованы в Promise для того, чтобы их можно было объединить в цепочку, чтобы выполненное значение одного Promise использовалось для вычисления значения, которое будет использоваться для выполнения следующего Promise в цепочке, или чтобы, если Promise отклонено, вызывались последующие функции отклонения. Входные и выходные типы обработчика выполнения не обязательно должны быть одинаковыми, поэтому цепочка обработчиков выполнения может преобразовать исходное значение в новое.
Обработчики выполнения и отклонения могут быть указаны как классы, которые реализуют интерфейсы Fulfill и Reject, или как функции с такими же сигнатурами, как методы apply в Fulfill и Reject.
В следующем коде выполнение Promise вызывает выполнение нескольких функций выполнения. Результат:
fulfilled + foo fulfilled + bar fulfilled + baz
use "promises"
class PrintFulfill is Fulfill[String, String]
let _env: Env
let _msg: String
new create(env: Env, msg: String) =>
_env = env
_msg = msg
fun apply(s: String): String =>
_env.out.print(" + ".join([s; _msg].values()))
s
actor Main
new create(env: Env) =>
let promise = Promise[String]
promise.next[String](recover PrintFulfill(env, "foo") end)
promise.next[String](recover PrintFulfill(env, "bar") end)
promise.next[String](recover PrintFulfill(env, "baz") end)
promise("fulfilled")
В следующем коде функции выполнения объединены в цепочку таким образом, что выполненное значение первого используется для создания значения, которое выполняет второе, которое в свою очередь используется для вычисления значения, которое выполняет третье, которое в свою очередь используется для вычисления значения, которое выполняет четвертое. Результатом является средняя длина слов, переданных в командной строке, или 0 если аргументы командной строки отсутствуют.
use "promises"
primitive Computation
fun tag string_to_strings(s: String): Array[String] val =>
recover s.split() end
fun tag strings_to_sizes(sa: Array[String] val): Array[USize] val =>
recover
let len = Array[USize]
for s in sa.values() do
len.push(s.size())
end
len
end
fun tag sizes_to_avg(sza: Array[USize] val): USize =>
var acc = USize(0)
for sz in sza.values() do
acc = acc + sz
end
acc / sza.size()
fun tag output(env: Env, sz: USize): None =>
env.out.print(sz.string())
actor Main
new create(env: Env) =>
let promise = Promise[String]
promise.next[Array[String] val](recover Computation~string_to_strings() end)
.next[Array[USize] val](recover Computation~strings_to_sizes() end)
.next[USize](recover Computation~sizes_to_avg() end)
.next[None](recover Computation~output(env) end)
promise(" ".join(env.args.slice(1).values()))
Публичные типы
- актор Promise
- примитивные Promises
- интерфейс Fulfill
- интерфейс Reject
- класс FulfillIdentity
- класс RejectAlways
© 2016-2020, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/promises--index