Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Angular 2/RxJs 5 beta observable从while循环中传输数据_Javascript_Angular_Observable_Rxjs - Fatal编程技术网

Javascript 使用Angular 2/RxJs 5 beta observable从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

我想在Angular 2中创建一个简单的应用程序,它计算(例如)while循环中的素数,并将新发现的值更新到视图中。我想用*ngFor实时显示primes数组,以便用户看到应用程序正在计算。脚本正在web worker中运行,因此while循环不应阻止应用程序。 这就是我的想法:

// 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())
,但这目前似乎不起作用。