2016-10-28 27 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 
相关问题