Observable.of không phải là một chức năng


189

Tôi đang gặp vấn đề với Observable.ofchức năng nhập khẩu trong dự án của tôi. Intellij của tôi nhìn thấy mọi thứ. Trong mã của tôi, tôi có:

import {Observable} from 'rxjs/Observable';

và trong mã của tôi, tôi sử dụng nó như thế:

return Observable.of(res);

Có ý kiến ​​gì không?


5
Kiểm tra các tài liệu mới nhất nếu bạn đang sử dụng rxjs6 về việc nhập khẩu và sử dụng đúng import { of } from 'rxjs'; return of(res); github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#import-paths & github.com/ReactiveX/rxjs/blob/master/...
fidev

Câu trả lời:


232

Thật ra tôi đã nhập sai. Trong phiên bản mới nhất của RxJS, chúng ta có thể nhập nó như thế:

import 'rxjs/add/observable/of';

21
Sau lần lấy thứ 192 của tôi, tôi nhận thấy rằng trong mã của mình, tôi đã nhập từ operator/- rxjs/add/operator/of- thay vì observable/. Cô ơi.
EricRobertBrewer

Tôi thấy tôi không cần sử dụng tuyên bố này trong một trong những dự án góc cạnh. Nhưng trong một cái khác, tôi phải nhập nó. Tôi không hiểu sự khác biệt. Bạn có biết lý do?
niaomingjian

1
Phiên bản góc cạnh, có lẽ?! Tôi đã không phải làm điều này cho 4.3.2 nhưng tôi đã làm cho 5.0.0.
Draghon

@Draghon: Chính xác là như vậy với tôi. Tôi đã không phải làm điều đó trong 4,4, bây giờ tôi làm 5,2. Thậm chí kỳ lạ hơn, tôi chỉ phải đưa nó vào một tệp và tất cả các tệp .ts khác chỉ cần chọn nó và rất tốt để sử dụng.
JP mười Berge

2
Điều gì xảy ra nếu tôi không thể tìm thấy mô-đun "rxjs / add / obsable / of"?
Enrico

167

Nếu bất cứ ai gặp vấn đề này trong khi sử dụng Angular 6 / rxjs 6, hãy xem câu trả lời tại đây: Không thể sử dụng Observable.of trong RxJs 6 và Angular 6

Nói tóm lại, bạn cần nhập nó như thế này:

import { of } from 'rxjs';

Và sau đó thay vì gọi

Observable.of(res);

chỉ dùng

of(res);

2
Cảm ơn bạn! Tìm ra hàng nhập khẩu trong Rx luôn là một nguồn thất vọng lớn đối với tôi vì sự biến động của api.
DomenicDatti

42

Mặc dù nghe có vẻ hoàn toàn lạ, nhưng với tôi, việc viết hoa chữ 'O' trong đường nhập khẩu là rất quan trọng import {Observable} from 'rxjs/Observable. Thông báo lỗi observable_1.Observable.of is not a functionvẫn còn nếu tôi nhập từ có thể quan sát được rxjs/observable. Lạ nhưng tôi hy vọng nó giúp được người khác.


39

Nếu bạn đang sử dụng Angular 6/7

import { of } from 'rxjs';

Và sau đó thay vì gọi

Observable.of(res);

chỉ dùng

of(res);

Điều này là do các thay đổi đối với phiên bản RxJS từ 5 đến 6 đã giới thiệu nhiều thay đổi đột phá. Bạn có thể xem cách di chuyển dự án Angular của mình tại đây: rxjs.dev/guide/v6/migration
Edric

29

Sai lầm ngớ ngẩn của tôi là tôi đã quên thêm /addkhi yêu cầu quan sát.

Là:

import { Observable } from 'rxjs/Observable';
import 'rxjs/observable/of';

Mà trực quan trông OK rxjs/observable/oftập tin becasue , trên thực tế, tồn tại.

Nên là:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';

như @Shaun_grady đã chỉ ra, bằng cách nào đó, nó không hoạt động. Tôi đã đi với lời đề nghị của anh ấy
Sonne

20

Dù sao đi nữa, patching không hiệu quả với tôi, vì vậy tôi phải dùng đến phương pháp này:

import { of } from 'rxjs/observable/of'

// ...

return of(res)

Đây không phải là một công việc xung quanh, đây là cú pháp cho Angular> = 6.0.0. nhập {of} từ 'rxjs' là tốt đối với tôi. Xem stackoverflow.com/questions/38067580/ từ
mark_h

18

Chỉ cần thêm,

nếu bạn đang sử dụng nhiều trong số họ thì bạn có thể nhập tất cả bằng cách sử dụng

import 'rxjs/Rx'; 

như được đề cập bởi @Thierry Templier. Nhưng tôi nghĩ rằng nếu bạn đang sử dụng toán tử giới hạn thì bạn nên nhập toán tử riêng lẻ như

import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/observable/of';

như được đề cập bởi @uksz.

Bởi vì 'rxjs / Rx' sẽ nhập tất cả các thành phần Rx mà chắc chắn chi phí hiệu suất.

So sánh


1
Tôi thấy tôi không cần sử dụng tuyên bố này trong một trong những dự án góc cạnh. Nhưng trong một cái khác, tôi phải nhập nó. Tôi không hiểu sự khác biệt. Bạn có biết lý do?
niaomingjian

16

Bạn cũng có thể nhập tất cả các toán tử theo cách này:

import {Observable} from 'rxjs/Rx';

7
Tôi không khuyên bạn nên nhập theo cách này, vì đây là một thư viện khá lớn và "của" là một phần rất nhỏ trong đó.
methgaard

2
@methgaard import { Observable } from 'rxjs/Observable' import 'rxjs/add/observable/of';không hoạt động. Chỉ import {Observable} from 'rxjs/Rx';hoạt động. Phiên bản là 5.4.2
niaomingjian

@methgaard Tôi xin lỗi. Tôi đã phạm một sai lầm. Thực tế là tôi đã nhận Observable_1.Observable.of(...).delay(...).timeout is not a function. Tôi đã không sử dụngimport 'rxjs/add/operator/timeout'
niaomingjian

Nó cũng làm tăng kích thước bó
Amirhossein Mehrvarzi

5

Tôi đang sử dụng Angular 5.2 và RxJS 5.5.6

Mã này không hoạt động:

     import { Observable,of } from 'rxjs/Observable';

     getHeroes(): Observable<Hero[]> {
        return of(Hero[]) HEROES;

      }

Mã dưới đây hoạt động:

    import { Observable } from 'rxjs/Observable';
    import { Subscriber } from 'rxjs/Subscriber';

     getHeroes(): Observable<Hero[]> 
     {
          return Observable.create((observer: Subscriber<any>) => {
              observer.next(HEROES);
              observer.complete();
          });

      }

Phương thức gọi:

this.heroService.getHeroes()
      .subscribe(heroes => this.heroes = heroes);

Tôi nghĩ rằng họ có thể di chuyển / thay đổi chức năng () trong RxJS 5.5.2


4

Điều này nên hoạt động đúng chỉ cần thử nó.

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';

4
// "rxjs": "^5.5.10"
import { of } from 'rxjs/observable/of';

.... 
return of(res)

Đây là một câu trả lời chỉ có mã. Bạn có thể giải thích những gì bạn đang cố gắng đề xuất?
Peter Wippermann

1
Xin chào, chúng tôi chỉ nên nhập toán tử mà chúng tôi cần, không phải toàn bộ "Có thể quan sát" vì vấn đề hiệu suất. Trong phiên bản mới (^ 5.5.10), cách nhập đúng toán tử "của" là: nhập {of} từ 'rxjs / obsable / of' ... Nó hoạt động cho trường hợp của tôi. Tôi sẽ chỉnh sửa độ phân giải của tôi. Cảm ơn Peter.
letanthang 23/07/18

4

Nâng cấp từ Angular 5 / Rxjs 5 lên Angular 6 / Rxjs 6?

Bạn phải thay đổi nhập khẩu và khởi tạo của bạn. Kiểm tra bài viết trên blog của Damien

Tl; dr:

import { Observable, fromEvent, of } from 'rxjs';

const yourResult = Observable
    .create(of(yourObservable))
    .startWith(null)
    .map(x => x.someStringProperty.toLowerCase());

//subscribe to keyup event on input element
Observable
    .create(fromEvent(yourInputElement, 'keyup'))
    .debounceTime(5000)
    .distinctUntilChanged()
    .subscribe((event) => {
        yourEventHandler(event);
    });

1
Sử dụng 6.0, cố gắng đăng ký vào Observable.create (của (val)) dẫn đến "this._subscribe không phải là một chức năng". Thay vào đó, tôi đã tạo thành công một quan sát bằng cách chỉ cần gọi "của (val)".
Jim Norman

3

RxJS 6

Khi nâng cấp lên phiên bản 6 của RxJSthư viện và không sử dụng rxjs-compatgói mã sau đây

import 'rxjs/add/observable/of';   
  // ...
  return Observable.of(res);

phải đổi thành

import { of } from 'rxjs';
  // ...
  return of(res);

2

Tôi đã có vấn đề này ngày hôm nay. Tôi đang sử dụng systemjs để tải các phụ thuộc.

Tôi đã tải Rxjs như thế này:

...
    paths: {
        "rxjs/*": "node_modules/rxjs/bundles/Rx.umd.min.js"
    },
...

Thay vì sử dụng đường dẫn sử dụng này:

var map = {
...
'rxjs':                       'node_modules/rxjs',
...
}

var packages = {
...
'rxjs': { main: 'bundles/Rx.umd.min.js', defaultExtension: 'js' }
...
}

Sự thay đổi nhỏ này trong cách systemjs tải thư viện đã khắc phục vấn đề của tôi.



2

Đối với góc 5+:

import { Observable } from 'rxjs/Observable';nên làm việc. Gói quan sát cũng phải phù hợp với quá trình nhập import { Observer } from 'rxjs/Observer';nếu bạn đang sử dụng trình quan sát đó là

import {<something>} from 'rxjs'; thực hiện một nhập khẩu lớn vì vậy tốt hơn là tránh nó.


2

Đối với tôi (Angular 5 & RxJS 5), nhập tự động hoàn thành được đề xuất:

import { Observable } from '../../../../../node_modules/rxjs/Observable';

thời gian để nên (với tất cả các nhà khai thác tĩnh from, of, vv làm việc tốt:

import { Observable } from 'rxjs/Observable';

1
import 'rxjs/add/observable/of';

cho thấy một yêu cầu của rxjs-compat

require("rxjs-compat/add/observable/of");

Tôi không có cài đặt này. Được cài đặt bởi

npm install rxjs-compat --save-dev

và chạy lại đã khắc phục vấn đề của tôi.



0

Bằng cách nào đó, ngay cả Webstorm cũng làm như thế này import {of} from 'rxjs/observable/of'; và mọi thứ bắt đầu hoạt động

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.