2016-10-28 1 views
1

비동기의 eachSeries의 기능을 구현하여 배열을 반복하고 수동으로 반복을 계속하기 위해 콜백을 호출하는 방법은 무엇입니까?자바 스크립트에서 Observables를 사용하여 "eachSeries"하는 방법은 무엇입니까?

내가 알아낼 수 있기 때문에 지금까지, 당신은 RxJs '관찰 가능한 this 같은 배열을 반복 할 수 있습니다

여기에 "자동으로"관찰이 방출 각 배열 요소
var array = [1,2,3,4,5]; 

// Converts an array to an observable sequence 
var source = Rx.Observable.from(array); 

// Prints out each item 
var subscription = source.subscribe(
    x => console.log('onNext: %s', x), 
    e => console.log('onError: %s', e), 
() => console.log('onCompleted')); 

// => onNext: 1 
// => onNext: 2 
// => onNext: 3 
// => onNext: 4 
// => onNext: 5 
// => onCompleted 

,하지만 난 그것을 어떻게 말할 것 필요할 때만 계속하십시오. RxJS의 Subject next() 메소드와 비슷하다.

사실 내 현실 시나리오는 관찰자 콜백 내부에서 다른 함수를 호출해야한다는 것입니다. async를 사용하면 해당 함수의 반복을 계속 수행하고 거기에서 호출하기 위해 async의 콜백을 전달합니다. 하지만 Observables로 어떻게 할 수 있는지 전혀 모른다. 그들은이 사건에 대해 어쨌든 적절합니까? 아니면 비동기에 집중해야합니까?

도움 주셔서 감사합니다.

+0

Observables은의 전체 개념 요점은 당신에게 데이터를 공급하는이 적절한 경우, 당신이 그것을 요구하지 않습니다. 그래서 당신이 투표를하지 않고 관찰하고있는 것입니다. – ssube

+0

은 유스 케이스에 달려 있지만'.concatMap'은 http://plnkr.co/edit/6TIO9uyuzKJu59a8WwO5?p=preview와 같은 일을해야합니다. –

답변

0

iterator/generator을 사용할 수 없습니까?

당신이 예에서처럼 반복 할 수있는 당신이 생각하고있는 사용 사례가 될 것으로 보인다

function *iterator(source) { 
 
    let i = 0, len = source.length; 
 
    for (i = 0; i < len; i++) { 
 
    yield source[i]; 
 
    } 
 
} 
 

 
var array = [1,2,3,4,5], iter = iterator(array); 
 

 
var val = iter.next(); 
 
while (!val.done) { 
 
    console.log(`${val.value} (done? ${val.done})`); 
 
    val = iter.next(); 
 
} 
 
console.log('done');

0

나는 이것이 당신이 무엇에 가까운 생각 필요 :

import {Observable, Subject} from 'rxjs'; 

var subject = new Subject(); 

var interval = setInterval(_ => { 
    subject.next(null); 
}, 1000); 

Observable.from([1,2,3,4,5]) 
    .concatMap(val => Observable.of(val) 
     .delayWhen(_ => subject) 
     .do(val => console.log('.do:', val)) 
    ) 
    .subscribe(val => console.log('next:', val), undefined,() => clearInterval(interval)); 

라이브 데모보기 : http://plnkr.co/edit/v77hCqOVDBqRxpWdW4Nv?p=preview

저는 수동으로 다음 값의 방출을 트리거 할 수 있도록 delayWhen() 연산자를 사용하고 있습니다. 그런 다음 concatMap()은 콜백에서 반환 된 이전 Observable이 완료 될 때까지 대기하므로 체인이 하나씩 올바른 순서로 호출됩니다.

Observable.from(...)의 초기 방출은 즉시 발생하며 각 항목은 concatMap()으로 지연됩니다.

이 데모 인쇄는 콘솔 :

.do: 1 
next: 1 
.do: 2 
next: 2 
.do: 3 
next: 3 
.do: 4 
next: 4 
.do: 5 
next: 5 
관련 문제