返回一个空的Observable

时间:2016-07-24 03:17:31

标签: javascript typescript rxjs observable

函数more()应该从get请求中返回Observable

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()为真的情况下执行请求,否则我在subscribe()函数subscribe is not defined上收到错误,如何返回空的observable?

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

更新

在RXJS 6中

import { EMPTY } from 'rxjs'

return EMPTY; 

11 个答案:

答案 0 :(得分:102)

对于打字稿,您可以指定空observable的通用参数,如下所示:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

答案 1 :(得分:44)

使用新语法,例如rxjs 5.5+,如下所示:

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

要记住一件事,empty()完成了observable,因此它不会在您的信息流中触发next,只会完成!因此,如果你有tap,他们可能没有按你的意愿获得触发器(参见下面的例子)。

of({})创建一个observable,然后使用值{}发出,然后完成observable。

e.g。

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

答案 2 :(得分:34)

在我使用Angular2和rxjs的情况下,它适用于:

Consumer

答案 3 :(得分:28)

是的,我有Empty运营商

Rx.Observable.empty();

对于打字稿,您可以使用from

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

答案 4 :(得分:28)

RxJS6(未安装兼容包)

现在有一个EMPTY常量和一个empty函数。

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

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

Observable.empty()不再存在。

答案 5 :(得分:13)

创建“空可观察”的几种方法:

它们只是在您进一步使用它的方式上有所不同(它将在nextcompletedo nothing之后发出什么事件),例如:

  • Observable.never() -不发出任何事件,并且永远不会结束。
  • Observable.empty() -仅发出 complete
  • Observable.of({}) -发出 next complete (空对象文字作为例如)。

根据您的实际需求使用它)

答案 6 :(得分:9)

您可以返回Observable.of(empty_variable),例如

Observable.of('');

// or
Observable.of({});

// etc

答案 7 :(得分:2)

或者您也可以尝试package main import ( "fmt" "runtime" ) func foo() { pc, _, _, ok := runtime.Caller(1) details := runtime.FuncForPC(pc) if ok && details != nil { fmt.Printf("called from %s\n", details.Name()) } } func main() { foo() }

答案 8 :(得分:0)

试试这个

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

答案 9 :(得分:0)

RxJS 6

您也可以使用以下功能:

return from<string>([""]);
导入后

import {from} from 'rxjs';

答案 10 :(得分:0)

在这里遇到类似的问题,上面的内容在"rxjs": "^6.0.0"中对我不起作用,为了生成一个可观察的对象,该对象不发出我需要做的数据:

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