首页 文章

Subject.onNext不是一个函数

提问于
浏览
7

我正在尝试在我的http代码中使用一些reactiveX . 为此,我正在创建一个Subject,并尝试调用onNext函数,但是我收到一条错误,说subject.onNext不是函数 .

HTML:
<input #search (input)="generateSuggestions($event.target.value)">

TS:

import { Jsonp, Response } from 'angular2/http';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject'
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/debounce';
import { Injectable } from 'angular2/core';

@Injectable()
export class SearchService {
    queryStream = new Subject();

    generateSuggestions(query: string) {
        this.queryStream.onNext(query)
            .debounce(500)
            .map(
                query => this.jsonp.request( `http://urlendpoint/${query}` )
                        .map( (res: Response) => res.json() )
                        .subscribe( results => console.log(results) );
            )
    }
}
var queryStream = new Subject();

ORIGINAL EXCEPTION:TypeError:this.queryStream.onNext不是函数

我的所有普通http函数都工作(this.jsonp.request(url / query).map() . subscribe())但是onNext运算符不起作用 . 我也无法导入flatMap,它似乎与map和debounce不在同一个'rxjs / add / operator / ...'文件夹中 .

2 回答

  • 10

    更换

    import { Observable } from 'rxjs/Observable';
    import { Subject } from 'rxjs/Subject'
    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/debounce';
    

    用:

    import * as Rx from "rxjs/Rx";
    

    Subject 替换为 Rx.Subject

    onNext 替换为 next

  • 0

    (我只是补充上面的答案)

    分组已从rxjs v6开始改变 . 只需提及在处理rxjs v6时要记住的事项 .

    我的 package.json

    "rxjs": "^6.0.0",
    "rxjs-compat": "^6.2.2",
    "rxjs-tslint": "^0.1.5",
    

    从v6开始,以下内容不起作用: -

    1.

    import * as Rx from 'rxjs/Rx'; (was earlier used for Rx.Observable.create(), etc )
    import { Observable } from 'rxjs/Observable'; 
    import { Subject } from 'rxjs/Subject';
    
    // instead, use :-
    
    import { Observable, Subject, of, from, fromEvent, interval } from 'rxjs';
    // cannot use rxjs/Rx from v6 onwards.
    

    2.

    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/debounce';
    
    // instead, use:
    
    import { map, debounce } from 'rxjs/operators';
    

相关问题