2016-01-20 4 views
1

Я новичок в Rx.js и ища базовую помощь с концепциями FRP. У меня есть один поток с использованием generateWithRelativeTime, который поддерживает цикл игры, и поток, который отслеживает разрешение экрана. Моя проблема с моим текущим кодом заключается в том, что мой игровой цикл работает только при изменении разрешения экрана.Что делать, если один поток зависит от значения от другого?

Поток, созданный моей функцией модели, требует последнего значения из res $.

function model(res$) { 
    return res$.map(res => { 
    const rows = ceil(res[1]/CELL.HEIGHT)+1 
    const cols = ceil(res[0]/CELL.WIDTH)+1 

    return Observable.generateWithRelativeTime(
     initWorld(rows, cols, 1.618), 
     noOp, 
     world => step(world), 
     noOp, 
     _ => 100, 
     Rx.Scheduler.requestAnimationFrame 
    ).timeInterval() 
    }); 
} 

function intent() { 
    return Observable.fromEvent(window, 'resize') 
        .map(e => [e.currentTarget.innerWidth, e.currentTarget.innerHeight]) 
        .debounce(100, Rx.Scheduler.requestAnimationFrame) 
        .startWith([window.innerWidth, window.innerHeight]) 
} 

model(intent()) 

ответ

1

Добро пожаловать в радость FRP. Как бы то ни было, трудно понять ваш вопрос. Как What to do when one stream depends on the value from another? связан с My problem with my current code is that my game loop only runs when my screen resolution changes.? Вы даете фактическое поведение, каково ваше ожидаемое поведение?

Для моего ограниченного понимания вопроса, я думаю, что вам нужно заменить эту строку return res$.map(res => { по return res$.flatMapLatest(res => {, т.е. использовать оператор flatMapLatest вместо оператора map.

Чтобы понять оператор flatMap, я рекомендую вам ознакомиться со следующими ресурсами: The introduction to reactive programming you've been missing, в illustrated marbles и official documentation.

PS: Я вижу, что вы, кажется, следуете архитектуре MODEL-VIEW-INTENT. Из любопытства вы экспериментируете с cyclejs?

+0

Спасибо! Это фактически зафиксировало это. Ожидаемое поведение заключалось в том, что игровой цикл должен запускаться, и каждый раз, когда он запускается, используйте последнее разрешение из потока res $. Теперь это работает :) Спасибо! – Brendan

+0

Кроме того, да, я играю с Cycle.js :) – Brendan

+0

Приятно, не могли бы вы принять или перенести ответ, чтобы сообщить, что это правильно или полезно для других читателей, которые могут наткнуться на этот вопрос из поиска Google? – user3743222

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