#c# #.net #linq #observable #reactive
Вопрос:
Я работаю с реактивными и тестировал конкатенацию. К сожалению, я кое-что не смог понять. Может ли кто-нибудь объяснить, почему вызывается только последнее завершенное:? Я действительно в замешательстве по этому поводу. Разве не предполагается, что все FirstAsync завершатся, как только они испустят первый элемент?
Простой пример кода:
Observable
.FirstAsync()
.Do(_ =>
{
}, onCompleted: () =>
{
//Not Invoked
})
.FirstAsync()
.Do(_ =>
{
}, onCompleted: () =>
{
//Properly Invoked
});
Комментарии:
1. Пожалуйста, добавьте код в виде текста, а не в виде изображения
2. Там нет необходимости в коде, если вы не знакомы с реактивным
3. Если Imgur по какой-либо причине выйдет из строя (как это сделал Facebook ранее на этой неделе), вопрос потеряет важный контекст. Пожалуйста, добавьте любую текстовую информацию в виде текста, а не изображений.
4. Изменил изображение на код в соответствии с запросом.
Ответ №1:
На самом деле, я думаю, что такое поведение вполне логично.
Вы эффективно создаете новую наблюдаемую из исходного source.FirstAsync().FirstAsync()
, а затем, я полагаю, подписываетесь на новую наблюдаемую. Вы ожидали бы, что он вернет свое единственное значение и завершит, и это так и есть. Однако нет никаких причин, по которым наблюдаемые объекты, из которых он получен, должны быть завершены: вы на них не подписывались. Есть два наблюдаемых объекта, из которых он получен: исходный источник и источник.FirstAsync().
Если источник имеет несколько конечных значений, было бы удивительно, если бы он вернул все значения и завершил, поскольку наше производное наблюдаемое касается только первого. Источник.Функция FirstAsync (), не завершившаяся, даже если она вернула свое единственное значение, вероятно, была дизайнерским решением для обеспечения согласованности.
Я надеюсь, что это достаточно ясно — изначально я пытался ответить примером кода, но это было еще более запутанно.