2016-07-24 33 views
47

Chức năng more() có nghĩa vụ phải trả lại một Observable từ một yêu cầu getLàm thế nào để trả về một thể quan sát được sản phẩm nào trong rxjs

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ể làm một yêu cầu nếu hasMore() là đúng, khác tôi nhận được một lỗi trên subscribe() chức năng subscribe is not defined, làm thế nào tôi có thể trả lại 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); 
    } 
) 
+0

Bạn đã nhận được giải pháp của mình chưa? bạn có thể vui lòng viết những gì có trong this.hasMore() – Rohitesh

+0

@Rohitesh 'hasMore() {return currentPage

Trả lời

60

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

Observable.empty<Response>(); 
20

Vâng, có đang Empty hành

Rx.Observable.empty(); 

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

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

Tôi nhận được' Rx.Observable <{}> 'không được gán cho' Quan sát ', tôi đã cố gắng' Rx.Observable .empty() 'nhưng nó không hoạt động –

+0

@MurhafSousli Tôi đã thêm mã cho bản ghi –

+0

Tôi đã thay đổi kiểu trả về thành 'Quan sát ' và nó hoạt động, nhờ bạn đời. –

6

Bạn có thể trở Observable.of (empty_variable), ví dụ

Observable.of(''); 

// or 
Observable.of({}); 

// etc 
0

Hãy thử điều 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(); 
1

Hoặc bạn có thể thử ignoreElements() cũng

22

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(); 
... 
+6

bao gồm nó với 'import {EmptyObservable} từ 'rxjs/observable/EmptyObservable';' – Kildareflare

+0

nhận được lỗi như thế này, tôi có cần cấu hình bất cứ thứ gì trong cấu hình hệ thống không? Không chấp nhận lời hứa từ chối: (SystemJS) Lỗi XHR (404 Không tìm thấy) đang tải http: // localhost: 9190/node_modules/rxjs/Quan sát/EmptyObservable.js \t Lỗi: Lỗi XHR (404 Không tìm thấy) đang tải http: // localhost : 9190/node_modules/rxjs/Quan sát/EmptyObservable.js – user630209

8

Với n cú pháp ew, ví dụ: rxjs 5.5+, điều này trở thành như sau:

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 thể quan sát được, vì vậy nó sẽ không kích hoạt next trong luồng của mình, chỉ hoàn thành! Vì vậy, nếu bạn có tap, ví dụ, chúng có thể không kích hoạt như bạn muốn (xem ví dụ bên dưới).

trong khi of({}) tạo ra một quan sát và phát ra tiếp theo với giá trị {}, nó sẽ không hoàn thành một mình, có lẽ bạn nên làm of({}).pipe(take(1)) để phát ra và hoàn thành.

ví dụ:

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

of({}).pipe(
    take(1), 
    tap(() => console.warn("i will reach here")) 
).subscribe(); 
Các vấn đề liên quan