2016-06-12 28 views
28

uczę RxJS i kątowe 2. Załóżmy, że mam łańcuch obietnica z wielu wywołań funkcji asynchronicznych, które są uzależnione od poprzedniego w wyniku której wygląda następująco:łańcuchowym obserwabli w 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); 
}); 

Moje próby robi te same wyłącznie przy użyciu RxJS bez użycia obietnic produkowane następujące:

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); 
}); 

To daje taki sam efekt jak w łańcuchu obietnicy. Moje pytania są następujące:

  1. Czy robię to dobrze? Czy są jakieś ulepszenia związane z RxJS, które mogę wprowadzić w powyższym kodzie?

  2. Jak uzyskać ten obserwowalny łańcuch, aby wykonywać go wielokrotnie? Dodawanie to kolejną subskrypcję na koniec tylko powoduje dodatkowy 6 chociaż można oczekiwać, że do drukowania 1, 3 i 6

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

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

Odpowiedz

21

O składzie obietnicy vs. Rxjs, jak to często zadawane pytanie, można odwołać się do wielu wcześniej zadawane pytania na SO, wśród których:

Zasadniczo flatMap jest odpowiednikiem Promise.then.

Aby uzyskać drugie pytanie, czy chcesz odtworzyć wartości już wyemitowane, czy chcesz przetworzyć nowe wartości po ich otrzymaniu? W pierwszym przypadku sprawdź operator publishReplay. W drugim przypadku wystarczy standardowa subskrypcja. Jednak możesz być świadomy zimna. kontra gorąca dychotomia w zależności od źródła (porównaj Hot and Cold observables : are there 'hot' and 'cold' operators? dla zilustrowanego wyjaśnienia pojęcia)