Какова семантика future :: then?

Меня смущает семантика комбинатора then.

Интуитивно понятно, что a.then(|r| f(r)) - это будущее, которое, когда a заканчивает r, превращается в f(r). Другими словами, составление f после a. Например. a считывает число из ввода-вывода, а f удваивает его. В этом есть смысл, и это была моя ментальная модель.

Копая глубже, на самом деле это еще не все. Закрытие, переданное в then, дает IntoFuture, что означает, что применение f к результату a возвращает другое будущее. Вышеупомянутое понимание неверно, так как f(r) все еще не решен полностью.

Из того, что я прочитал в документации и исходном коде, похоже, следующее: a.then(|r| f(r)), по сути, продолжает опрос, пока не будет разрешен будущий a, затем продолжайте опрос f(r) (что также является будущим), пока он не разрешится. Наконец все решено.

Правильно ли так думать об этом? Зачем нам нужен второй слой фьючерсов?

Что вы имеете в виду под вторым слоем будущего?

Boiethios 26.10.2018 09:54
1
1
90
1

Ответы 1

then не ждет завершения будущего. Это лениво, как сказал документ:

The closure is only run after successful completion of the self future.

Он в основном объединяет 2 фьючерса. Предположим, у вас есть:

  • один будущий future_a, который "вычисляет" a,
  • один метод foo, который принимает a и возвращает future_b.
future_a.then(foo)

будет будущее, которое объединит эти 2 фьючерса, чтобы вернуть future_b

Я думаю, что это то, что делает map(), в то время как then() связывает два фьючерса.

Sven Marnach 26.10.2018 11:52

@SvenMarnach О да, ты прав. Это ошибка. Вы хотите ответить, или мне следует отредактировать свой ответ?

Boiethios 26.10.2018 12:04

У меня нет времени отвечать прямо сейчас, так что продолжайте. :)

Sven Marnach 26.10.2018 12:06

@SvenMarnach Я понимаю, что это лениво. В вашем примере предположим, что t = future_a.then(foo). Мой вопрос: когда вызывается t.wait(), future_a сначала разрешается до «a», затем после, который вычисляется, foo (a) и возвращает future_b. future_b тоже решился или вернул как есть?

qweruiop 26.10.2018 15:47

@SvenMarnach, может, я это увижу. это не что иное, как разница между map(foo) и then(foo): map возвращает foo(a), а then разрешает foo(a).

qweruiop 26.10.2018 15:50

Другие вопросы по теме