more()函数应该从get请求返回一个可观察对象

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();
    });
  };
}

在这种情况下,我只能做一个请求,如果hasMore()为真,否则我得到一个错误订阅()函数订阅没有定义,我怎么能返回一个空的可观察对象?

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

当前回答

还有一个:EMPTY const

替换为EMPTY常量或scheduled(例如scheduled([], scheduler))。将在v8中删除。(得到这个表单phpstorm提示)

其他回答

对于typescript,你可以像这样指定空可观察对象的泛型参数:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

还有一个:EMPTY const

替换为EMPTY常量或scheduled(例如scheduled([], scheduler))。将在v8中删除。(得到这个表单phpstorm提示)

使用RxJS 5.5+的新语法,它变成如下所示:

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

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

empty(); // deprecated use EMPTY
EMPTY;
of({});

只有一件事要记住,EMPTY完成了可观察对象,所以它不会在你的流中触发next,而只是完成。所以,如果你有,例如,点击,他们可能不会得到你所希望的触发(见下面的例子)。

而of({})创建了一个Observable,并发出了一个值为{}的next,然后它完成了Observable。

例如:

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();

试试这个

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();

你可以用各种不同的方式返回空的可观察对象,但挑战是用预期的类型返回它 下面是创建一个类型为-的空观察对象的方法

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    
return next.handle(this.setHeaders(req))
            .pipe(
                catchError((error: HttpErrorResponse) => {
        // you write your logic and return empty response if required
        return new Observable<HttpEvent<any>>();
            }));
    }