Spec-Zone.ru › Pony

Пакет 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API