2015-08-27 31 views
7

Używam tutaj RxJS i nie mogę pozbyć się tego problemu z pozornie.RxJS: Dzielenie wyniku tablicy z Observable.fromPromise

rx.Observable 
    .from([1,2,3,54,3,22,323,23,11,2]) 
    .distinct() 
    .subscribe(function next (x) { 
     console.log('Next'); 
     console.log(x); 
    }, function error (x) { 
     console.log('Error'); 
     console.log(x); 
    }, function completed() { 
     console.log('Completed'); 
    }); 

Powyższy kod wypluwa każdy element tablicy w kolejności zgodnie z oczekiwaniami.

rx.Observable 
    .fromPromise(getNumbers([1,2,3,54,3,22,323,23,11,2])) 
    .distinct() 
    .subscribe(function next (x) { 
     console.log('Next'); 
     console.log(x); 
    }, function error (x) { 
     console.log('Error'); 
     console.log(x); 
    }, function completed() { 
     console.log('Completed'); 
    }); 

function getNumbers (nums) { 
    return new Promise(function (resolve, reject) { 
     resolve(nums); 
    }); 
} 

Tutaj otrzymuję tylko pełną tablicę (tj. [ 1, 2, 3, 54, 3, 22, 323, 23, 11, 2 ]). Czy RxJS nie powinien rozdzielać wyniku? Mam nadzieję, że przynajmniej miała jakąś logikę do tego.

Dziękuję

+0

Alternatywnie Absolutnie chciałbym być gotowi do wykonywania jakiegoś przekształcić które mogą mutować strumienia * po * obietnica zostanie rozwiązany .. np odbierz pełną tablicę (1 pozycję w strumieniu) i zamień ją na elementy array.length w strumieniu. –

Odpowiedz

15

Nie, to nie złamie je od siebie w sposób dorozumiany. Jeśli chcesz podzielić je wykorzystywać flatMap które spłaszczają tablicy:

rx.Observable 
    .fromPromise(getNumbers([1,2,3,54,3,22,323,23,11,2])) 
    .flatMap(function(x) { return x; }) 
    .distinct() 
    .subscribe(function next (x) { 
     console.log('Next'); 
     console.log(x); 
    }, function error (x) { 
     console.log('Error'); 
     console.log(x); 
    }, function completed() { 
     console.log('Completed'); 
    }); 
+0

Dziękujemy! Właśnie tego szukałem. –

+2

Piękny, nie wiedziałem, że 'flatMap' spłaszczyłby iterowalną. – Brandon

+0

Wohoo, doskonała odpowiedź, rozwiązany mój problem, wielkie dzięki @paulpdeniels – hhsadiq