2017-01-13 4 views
2

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

wait 1 hour 
tweets something 
wait 5 hours 
tweets something 
wait 30 minutes 
tweets something 
wait 10 hours 
tweets something 

, где время задержки между 10 часов или что-то вроде этого

Проблема с наблюдаемыми заключается в том, что мне нужно сгенерировать эти интервалы, а затем подавать их в цепочку наблюдаемых. Например, мне нужно создать массив со всеми задержками, и только они подписываются на него, чтобы чирикать.

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

Rx.Observable.just().timer(randomTime()).subscribe(emitObservableAgain()); 

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

ТАКЖЕ, как импортировать rx.timer в nodejs? Импорт только «гх» (от НПМ) не даст мне этим функциям

ответ

3

Вы можете использовать повтор:

Rx.Observable.just() 
    .switchMap(() => Rx.Observable.timer(randomTime())) 
    .do(tweetMyThing) 
    .repeat() 
    .subscribe(); 

Edit: Я добавил жить-скрипт, который показывает, как работает поток:

// Helper-Methods to visualize the stream 
 
function randomTime() { 
 
    return ~~(Math.random() * 2000) + 50; 
 
} 
 

 
var lastReceivedEvent = +new Date(); 
 
function tweetMyThing(value) { 
 
    console.log("Received after " + (+new Date() - lastReceivedEvent)); 
 
    lastReceivedEvent = +new Date(); 
 
} 
 
// \end of helper-methods 
 

 
// the stream 
 
Rx.Observable.just() 
 
    .switchMap(() => Rx.Observable.timer(randomTime())) 
 
    .do(tweetMyThing) 
 
    .repeat(20) 
 
    .subscribe();
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>

+0

почему switchMap? Это сработало, но я хотел знать, как именно это работает. Я могу только думать о repeat() как возврате нового Observable, но сразу же испускаю последний, чтобы подписка могла его поймать. Это так? – Gatonito

+0

Я попытался понять это больше, вот он: switchMap похож на flatMap, но он сразу же переключает поток при вызове. Итак, вы ничего не выбрали, переключившись на Наблюдаемый, который испускает случайное время, сделал этот наблюдаемый триггер (tweetMyThing). Я просто не совсем понял повторение(). Как я понял, он возвращает поток, который повторяет (по умолчанию, по-моему,) последний поток. Я просто не понимаю, почему он все повторяет и выполняет randomTime(). Зачем? Для меня repeat() просто переизлучил бы более старый поток со временем, когда он был впервые задуман. – Gatonito

+0

Повтор повторяется навсегда по умолчанию и будет повторять весь поток, включая настройку новой случайной задержки - вы проверили это? - И switchMap и flatMap можно использовать одинаково в этом случае: Но когда есть сомнения: используйте switchMap – olsn