2016-01-14 10 views
3

Как создать наблюдаемую последовательность случайных чисел в диапазоне с помощью rxjs observable?Наблюдаемая последовательность случайных чисел в диапазоне

Я могу перебирать диапазон, используя range.

Например:

Observable.range(0, 20) 
    .flatMap(data => getImage(data)) 
    .map(data => this.image = data); 

Тем не менее, я хотел бы, чтобы он непрерывно генерировать случайное число для последовательности до тех пор, пока я заставить его остановиться. Не просто перебирайте значения до тех пор, пока они не будут выполнены.

ПРИМЕЧАНИЕ: Я использую rxjs 5. Который не имеет while.

+0

как заставить его остановиться? – user3743222

+0

@ user3743222 Я добавил ответ на ваш вопрос в своем ответе. – prolink007

ответ

1

Это будет генерировать случайное число в пределах интервалов времени. Это именно то, что мне нужно.

let mySubscription: Subscription<number> = Observable.interval(3000) 
    .map(data => generateRandomNumber(...)) 
    .subscribe(
     data => console.log(data), 
     error => console.log(error), 
     () => console.log("complete") 
    ); 

Чтобы остановить наблюдателя, просто отказаться от подписки.

mySubscription.unsubscribe(); 

generateRandomNumber() это метод, который просто генерирует случайное число для меня. Это выходит за рамки проблемы.

+0

ах ок, у меня нет вопроса о том, что вы хотели генерировать случайный каждый период времени. Это важная деталь, потому что с «диапазоном» вы сразу же выделяете все значения последовательно (фактически также синхронно) один за другим, поэтому вы даже не сможете отказаться от подписки до того, как будут испущены все значения. – user3743222

+0

@ user3743222 Да, возможно, я не правильно сформулировал вопрос. Спасибо за помощь. – prolink007

1

Если у вас есть доступ к generator functions вы могли бы сделать что-то подобное с помощью Observable.from: (Typescript support)

jsbin

function* generator(min, max){ 
    while (true) { 
    yield Math.random() * (max - min) + min; 
    } 
} 

Rx.Observable.from(generator(0, 9000)) 
    .take(42) 
    .subscribe(value => console.log(value)); 

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

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