2016-10-28 18 views
1

我將如何實現async的eachSeries的功能,在此迭代數組並手動調用回調來繼續迭代?如何在JavaScript中使用Observable「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()方法一樣。

事實上,我現實世界的場景是我需要調用觀察者回調中的其他函數。通過異步,我會傳遞異步的回調來繼續迭代到那個函數並從那裏調用它。但我不知道如何用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 
相關問題