Может ли кто-нибудь объяснить, почему объединение многих FirstAsync заблокирует завершение родительских наблюдаемых?

#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 (), не завершившаяся, даже если она вернула свое единственное значение, вероятно, была дизайнерским решением для обеспечения согласованности.

Я надеюсь, что это достаточно ясно — изначально я пытался ответить примером кода, но это было еще более запутанно.