2014-10-30 7 views
2

Если я создаю наблюдаемый, используя метод $ createObservableFunction, и я подписываюсь на это наблюдаемое несколько раз. Последний абонент переопределяет любого другого абонента.

Однако, если я создаю наблюдаемый с rx.Observable.interval() и подписываюсь на это несколько раз. Оба абонента стреляют по интервалу.

Почему? Что еще более важно, как мне получить $ createObservableFunction для запуска обоих абонентов.

app.controller('MainCtrl', function($scope, rx) { 

    var test = $scope.$createObservableFunction('testClick'); 
    var test2 = rx.Observable.interval(3000); 


    test.subscribe(function(){ 
    console.log('I never run, why?'); 
    }); 

    test.subscribe(function(){ 
    console.log('Why am I overriding the above subscribe'); 
    }); 


    test2.subscribe(function(){ 
    console.log('This observable runs both subscribed functions') 
    }); 

    test2.subscribe(function(){ 
    console.log('See this gets called and so does the above'); 
    }); 


}); 

Пример плункера, который иллюстрирует проблему. http://plnkr.co/edit/kXa2ol?p=preview

+1

Так что я думаю, что я понял, почему это не работает. $ createObservableFunction() использует метод Rx.Observable.create(), который возвращает реализацию singleCast подписчика. Для многоадресной рассылки вам нужно сделать $ createObservableFunction(). Publish(). RefCount(), чтобы сохранить соединение с источником. –

+0

Для записи новые версии rx.angular делают это по умолчанию. – PhiLho

ответ

1

Вы должны поделиться наблюдателем. Посмотрите этот плункер: http://plnkr.co/edit/4cVzpNVAel2Izcqg60Ci

Это то же самое, что и ваш код, но на нем есть .share().

var test = $scope.$createObservableFunction('testClick').share(); 

Я не в полной мере понять разницу между горячими и холодными наблюдателями, но в основном, вы делаете наблюдатель горячим, когда вы разделяете его. Вот прекрасная статья, которая помогла мне понять несколько лучше: http://jaredforsyth.com/2015/03/06/visualizing-reactive-streams-hot-and-cold/ и webapp, который позволяет вам видеть ВАШ код, так же, как это показывает статья: http://jaredforsyth.com/rxvision/examples/playground/

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

  • Нет связанных вопросов^_^