2016-06-12 6 views
28

Я учусь RxJS и Угловое 2. Допустим, у меня есть обещание цепь с несколькими вызовами функции асинхронной, которые зависят от предыдущего своего результата, который выглядит следующим образом:Chaining Наблюдаемые в RxJS

var promiseChain = new Promise((resolve, reject) => { 
    setTimeout(() => { 
    resolve(1); 
    }, 1000); 
}).then((result) => { 
    console.log(result); 

    return new Promise((resolve, reject) => { 
    setTimeout(() => { 
     resolve(result + 2); 
    }, 1000); 
    }); 
}).then((result) => { 
    console.log(result); 

    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
     resolve(result + 3); 
     }, 1000); 
    }); 
}); 

promiseChain.then((finalResult) => { 
    console.log(finalResult); 
}); 

Мои попытки делать те же исключительно с использованием RxJS без использования обещаний производится следующим образом:

var observableChain = Observable.create((observer) => { 
    setTimeout(() => { 
    observer.next(1); 
    observer.complete(); 
    }, 1000); 
}).flatMap((result) => { 
    console.log(result); 

    return Observable.create((observer) => { 
    setTimeout(() => { 
     observer.next(result + 2); 
     observer.complete() 
    }, 1000); 
    }); 
}).flatMap((result) => { 
    console.log(result); 

    return Observable.create((observer) => { 
    setTimeout(() => { 
     observer.next(result + 3); 
     observer.complete() 
    }, 1000); 
    }); 
}); 

observableChain.subscribe((finalResult) => { 
    console.log(finalResult); 
}); 

Это дает тот же результат, что и обещание цепи. Мои вопросы:

  1. Имею ли я это право? Есть ли какие-либо улучшения, связанные с RxJS, которые я могу внести в код выше

  2. Как получить эту наблюдаемую цепочку для повторного выполнения? т.е. Добавление другого подписку в конце концов просто производит дополнительный 6 хотя я ожидать, что это напечатать 1, 3 и 6.

    observableChain.subscribe ((finalResult) => { console.log (finalResult); });

    наблюдаемыйChain.subscribe ((finalResult) => { console.log (finalResult); });

ответ

21

О обещание композиции против Rxjs, так как это часто задаваемый вопрос, вы можете обратиться к ряду ранее задаваемые вопросы по SO, среди которых:

В принципе, flatMap является эквивалентом Promise.then.

Для вашего второго вопроса, хотите ли вы воспроизвести уже испущенные значения или хотите обработать новые значения по мере их поступления? В первом случае проверьте оператор publishReplay. Во втором случае стандартной подписки достаточно. Однако вам может потребоваться знать о холоде. против горячей дихотомии в зависимости от вашего источника (см. Hot and Cold observables : are there 'hot' and 'cold' operators? для иллюстративного объяснения концепции)

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