Javascript 使用Angular 2/RxJs 5 beta observable从while循环中传输数据
我想在Angular 2中创建一个简单的应用程序,它计算(例如)while循环中的素数,并将新发现的值更新到视图中。我想用*ngFor实时显示primes数组,以便用户看到应用程序正在计算。脚本正在web worker中运行,因此while循环不应阻止应用程序。 这就是我的想法:Javascript 使用Angular 2/RxJs 5 beta observable从while循环中传输数据,javascript,angular,observable,rxjs,Javascript,Angular,Observable,Rxjs,我想在Angular 2中创建一个简单的应用程序,它计算(例如)while循环中的素数,并将新发现的值更新到视图中。我想用*ngFor实时显示primes数组,以便用户看到应用程序正在计算。脚本正在web worker中运行,因此while循环不应阻止应用程序。 这就是我的想法: // Prime Service getPrimes(n: number) { var i = 0; while (1) { this.isPrime(i) ? this._data
// Prime Service
getPrimes(n: number) {
var i = 0;
while (1) {
this.isPrime(i) ? this._dataStore.primes.push(i) : null;
this.primes$.next(this._dataStore.primes);
i++;
}
}
只有在完成所有循环后才推送项目(也使用for循环进行测试)。我尝试过使用生成器,但该功能在RXJS5测试版中似乎还不起作用
是否有更好的解决方案,或者观察值通常不适合我的要求?您可以使用运算符生成数字序列,然后使用isPrime()方法过滤序列
你也可以使用。但我认为它还没有得到Angular的支持
下面是一个示例代码。您只需要更改isPrime()实现和数字的范围
import {Component} from 'angular2/core';
import {Observable} from 'rxjs/Rx';
@Component({
selector: 'my-app',
template: `<h1>Count: {{primes.length}}</h1>
<div *ngFor="#prime of primes">{{prime}}</div>`
})
export class AppComponent {
primes:number[] = [];
ngOnInit(){
var source = Observable.range(2,1000);
source.filter(i => this.isPrime(i)).subscribe(i=>this.primes.push(i));
}
isPrime(num:number){
for(let n of this.primes)
if(num % n ===0) return false
return true;
}
}
从'angular2/core'导入{Component};
从'rxjs/Rx'导入{Observable};
@组成部分({
选择器:“我的应用程序”,
模板:`Count:{{primes.length}}
{{prime}}`
})
导出类AppComponent{
素数:数[]=[];
恩戈尼尼特(){
var源=可观测范围(21000);
source.filter(i=>this.isPrime(i)).subscribe(i=>this.primes.push(i));
}
iPrime(num:number){
for(设n的这个素数)
如果(num%n==0)返回false
返回true;
}
}
我认为while()
是阻塞;您可以仅使用可观察对象创建类似的功能,使用interval
进行创建,并使用takeUntil
停止执行……如何在其中添加getPrimes函数?最好的方法当然是将其转换为生成器方法并执行Observable.from(getPrimes())
,但这目前似乎不起作用。