2016-10-28 4 views
1

asyncのeachSeriesの機能をどのように実装すれば、配列を繰り返し処理し、繰り返しを続けるためにコールバックを手動で呼び出すことができますか?私の知る限り把握できて、あなたがRxJs'観察可能thisなどで配列を反復処理することができますObservablesをJavaScriptで使用する "eachSeries"への方法は?

ここ
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を使用すると、非同期のコールバックを渡してその関数への反復を継続し、そこから呼び出すことができます。しかしObservablesでそれをどうやって行うのかわからない。彼らはとにかくこの場合に適切ですか?それとも、私は非同期に固執すべきですか?

ありがとうございました!

+0

、あなたはそれを要求しません。だからあなたがポーリングではなく、観察しているのです。 – 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 
関連する問題