2017-02-16 2 views
2

У меня есть соединяемый наблюдаемым, что будет присоединяться, когда другой поток выполняется:Почему соединяемый наблюдаемым получить выполнить только один раз

const source1 = Rx.Observable.of([1,2,3,4,5]) 
    .do(() => console.log('Do Something!')) 
    .map(() => "Always connected.") 
    .publish(); 

source1.subscribe((v) => console.log(v)); 

const connect =() => { 
    let c = false; 
    return() => { 
    if (!c) { 
     console.log("Get connected"); 
     source1.connect(); 
     c = true; 
    } 
    } 
} 


const source2 = Rx.Observable.fromEvent(document, 'click') 
    .do(() => console.log("execute!")) 
    .do(connect()) 
    .switchMapTo(source1); 

source2.subscribe((v) => console.log(v)); 

Вывод,

"execute!" 
"Get connected" 
"Do Something!" 
"Always connected." 

Дальнейшие клики по документу source1 будет не подписываться больше, и мой вопрос, почему?

ответ

1

Вы столкнулись именно эта ситуация: Rx.Subject loses events

Если вы обновляете первую часть вашего примера, вы увидите, что субъект получает уведомление complete:

const source1 = Rx.Observable.of([1,2,3,4,5]) 
    .do(() => console.log('Do Something!'), null,() => console.log('source1 complete')) 
    .map(() => "Always connected.") 
    .publish(); 

Это отмечает, что, как Subject закрыт, и он не повторит никаких значений.

См. Мой связанный ответ выше для получения более подробной информации. Также вы можете посмотреть на On The Subject Of Subjects (in RxJS) (paragramp Субъектов Не многоразовый) Бен поводке (ведущий разработчик RxJS 5.

+0

Есть ли у вас какие-либо предлагаемые решения? Конечно, это общая картина, где вы хотите выполнить наблюдаемым несколько раз.Я пытаюсь реализовать что-то подобное с RxSwift, где у меня есть подключаемый наблюдаемый, который обертывает сетевой запрос. Если сетевой запрос завершается неудачно, то я хотел бы иметь возможность повторно подключиться ... –

Смежные вопросы