Trả lại một quan sát trống


166

Hàm more()được cho là trả về một Observableyêu cầu nhận

export class Collection{

    public more = (): Observable<Response> => {
       if (this.hasMore()) {

         return this.fetch();
       }
       else{
         // return empty observable
       }
    }

    private fetch = (): Observable<Response> => {
       return this.http.get('some-url').map(
          (res) => {
              return res.json();
          }
       );
    }
}

Trong trường hợp này tôi chỉ có thể thực hiện một yêu cầu nếu hasMore()là đúng, nếu không tôi gặp lỗi về subscribe()chức năng subscribe is not defined, làm thế nào tôi có thể trả về một sản phẩm nào có thể quan sát được?

this.collection.more().subscribe(
   (res) =>{
       console.log(res);
   },
   (err) =>{
       console.log(err);
   }
)

Cập nhật

Trong RXJS 6

import { EMPTY } from 'rxjs'

return EMPTY; 

Câu trả lời:


129

Đối với bản thảo, bạn có thể chỉ định param chung của bạn có thể quan sát được như thế này:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

26
Điều này bây giờ nên import "EmptyObservable" from "rxjs/observable/EmptyObservable";, sau đó new EmptyObservable<Response>();.

86

Với cú pháp mới của RxJS 5.5+, điều này trở thành như sau:

// RxJS 6
import { empty, of } from "rxjs";

// rxjs 5.5+ (<6)
import { empty } from "rxjs/observable/empty";
import { of } from "rxjs/observable/of";

empty();
of({});

Chỉ cần một điều cần lưu ý, empty()hoàn thành có thể quan sát được, vì vậy nó sẽ không kích hoạt nexttrong luồng của bạn, nhưng chỉ hoàn thành. Vì vậy, nếu bạn có, ví dụ,tap họ có thể không nhận được kích hoạt như bạn muốn (xem ví dụ bên dưới).

Trong khi đó of({})tạo một Observablevà phát ra tiếp theo với một giá trị {}và sau đó nó hoàn thành Observable.

Ví dụ:

empty().pipe(
    tap(() => console.warn("i will not reach here, as i am complete"))
).subscribe();

of({}).pipe(
    tap(() => console.warn("i will reach here and complete"))
).subscribe();


1
of('foo')không phát ra và hoàn thành có thể quan sát ngay lập tức. rxviz.com/v/0oqMVW1o
SimplGy

@SimplGy vâng, bạn đúng, tôi đã sử dụng take(1)loại bỏ để có câu trả lời tốt hơn. @MatthijsWessels, có và không, chỉ cần thử nghiệm điều này ngay bây giờ và nếu bạn làm of()sẽ trả lại một thứ hoàn toàn có thể quan sát được mà không phát ranext
Stephen Lautier

trống bây giờ không được dùng nữa, thay vào đó hãy sử dụng EMPTY (được sử dụng như một hằng số thay vì như một phương thức, xem câu trả lời của Simon_Weaver).
EriF89

Xin lưu ý, của () không phát ra bất kỳ giá trị nào. Nếu bạn muốn một giá trị, bạn nên cung cấp bất kỳ giá trị nào, thậm chí không xác định hoặc null là ổn đối với điều đó: of (null) phát ra giá trị (và các quy trình với phương thức tap / đăng ký), trong khi của () thì không.
Maxim Georgievskiy

51

RxJS6 (không cài đặt gói tương thích)

Bây giờ có một EMPTYhằng số và một emptychức năng.

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

  var delay = empty().pipe(delay(1000));     
  var delay2 = EMPTY.pipe(delay(1000));

Observable.empty() không tồn tại nữa.



Nếu bạn có một xung đột, chẳng hạn như một empty()chức năng, bạn có thể nói import { empty as rxEmpty }hoặc import { empty as _empty }sau đó thực hiện rxEmpty()hoặc _empty(). Tất nhiên đó là một điều không chuẩn để làm và tôi thực sự không khuyến nghị điều đó, nhưng tôi chắc chắn tôi không phải là người duy nhất ngạc nhiên khi RxJS nghĩ rằng nó xứng đáng để nhập các hàm như ofemptyvào không gian tên của tôi!
Simon_Weaver

1
cẩn thận nếu sử dụng Angular vì đó cũng import { EMPTY } from "@angular/core/src/render3/definition";hoàn toàn không phải là điều bạn muốn. Vì vậy, nếu bạn gặp phải lỗi lạ, hãy chắc chắn rằng bạn không nhập sai.
Simon_Weaver

Observable.empty()thực sự vẫn tồn tại nhưng nó không được ủng hộ EMPTY.
Alexander Abakumov

39

Trong trường hợp của tôi với Angular2 và rxjs, nó đã hoạt động với:

import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...

7
bao gồm nó vớiimport {EmptyObservable} from 'rxjs/observable/EmptyObservable';
Kildareflare

gặp lỗi như thế này, tôi có cần cấu hình bất cứ thứ gì trong system-config không? Từ chối hứa hẹn chưa được xử lý: (SystemJS) Lỗi XHR (Không tìm thấy 404) đang tải localhost: 9190 / node_modules / rxjs / Observable / EmptyObservable.js Lỗi: Lỗi XHR (404 Không tìm thấy) đang tải localhost: 9190 / node_mod / js
user630209

29

Có, có toán tử rỗng

Rx.Observable.empty();

Đối với bản thảo, bạn có thể sử dụng from:

Rx.Observable<Response>.from([])

Tôi nhận được Rx.Observable<{}>là không thể gán Observable<Response>, tôi đã cố gắng Rx.Observable<Response>.empty()nhưng nó không hoạt động
Murhaf Sousli

Tôi đã thay đổi kiểu trả về Observable<any>và nó hoạt động, cảm ơn người bạn đời.
Murhaf Sousli

2
Nó nên Rx.Observable.from([])không có <Response>. Nếu không, sẽ nhận được một lỗi "biểu hiện mong đợi".
Andriy Tolstoy

2
Bạn cũng có thể dùng Rx.Observable.of([]) .
Andriy Tolstoy

1
@AndriyTolstoy Tôi không chắc điều này là tương đương. Trong Observable.of([])đó, có một giá trị được phát ra ( []) và sau đó luồng hoàn thành. Với Observable.from([]), không có giá trị nào được phát ra, luồng hoàn thành ngay lập tức.
Pac0

24

Một số cách để tạo một sản phẩm quan sát trống:

Chúng chỉ khác nhau về cách bạn sẽ sử dụng nó hơn nữa (những sự kiện nào nó sẽ phát ra sau : next, completehoặc do nothing), vd:

  • Observable.never() - không phát ra sự kiện và không bao giờ kết thúc
  • Observable.empty()- chỉ phát ra complete.
  • Observable.of({})- phát ra cả hai nextcomplete(đối tượng rỗng theo nghĩa đen được truyền qua làm ví dụ).

Sử dụng nó theo nhu cầu chính xác của bạn)


13

Ví dụ, bạn có thể trả về Observable.of (blank_variable)

Observable.of('');

// or
Observable.of({});

// etc


1

RxJS 6

bạn cũng có thể sử dụng từ chức năng như dưới đây:

return from<string>([""]);

sau khi nhập:

import {from} from 'rxjs';

2
Điều này sẽ tạo ra một Observable sẽ cung cấp một yếu tố (một chuỗi trống), vì vậy nó không giống như một câu trả lời thích hợp cho câu hỏi cụ thể này.
BrunoJCM

1

Đến đây với một câu hỏi tương tự, những điều trên không có tác dụng với tôi : "rxjs": "^6.0.0", để tạo ra một thứ có thể quan sát được mà không phát ra dữ liệu nào tôi cần phải làm:

import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
  params: Observable<any> = empty();
}

0

Thử cái này

export class Collection{
public more (): Observable<Response> {
   if (this.hasMore()) {
     return this.fetch();
   }
   else{
     return this.returnEmpty(); 
   }            
  }
public returnEmpty(): any {
    let subscription = source.subscribe(
      function (x) {
       console.log('Next: %s', x);
    },
    function (err) {
       console.log('Error: %s', err);
    },
    function () {
       console.log('Completed');
    });
    }
  }
let source = Observable.empty();
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.