RxJS:Observable.create()vs. Observable.from()

时间:2016-12-13 01:58:39

标签: javascript rxjs observable rxjs5

这两者之间的区别是什么?

return Observable.create(function(observer) {
    if (array)
        observer.next([]);
    else
        observer.next(null);
    observer.complete();
});

return Observable.from( array ? [] : null );

我认为它可能是相同的但是没有相同的工作。

4 个答案:

答案 0 :(得分:16)

create(...)是用于创建Observable的通用Observable工厂方法,您将在其中明确指示如何将值传递给Subscriber

例如,如果你要创建一个计时器基础Observable(不要它已经存在为Observable.timer),你可以这样做:

   Observable.create(observer => {
     const timeoutId = setTimeout(() => {
       observer.next(0);
       observer.complete();
     }, 500);

     return () => clearTimeout(timeoutId);
   });

from(...)就是我所说的一致性运算符,因为它试图将传入的数据类型强制转换为Observable(使其符合)。这意味着它将接受各种类型并将其转换为Observables。这些类型包括:

  • 阵列
  • 承诺
  • 发电机
  • 可观察的事物

您可以找到特定的转换器,例如fromArrayfromPromise,它们专门转换这些类型,但from更多的瑞士军刀这些方法

如果您只需要一个值,那么您应该使用Observable.of(文档似乎已过时,just/return已在RxJS 5中重命名为of而我不会认为他们已经别名了。)

// Don't quote me on the import part
import 'rxjs/add/observable/of';

Observable.of(1, 2, 3, 4).subscribe();

答案 1 :(得分:0)

一个区别是:Declare @table table (user_id int, event_code int, total_bookmarks int, total_folders int, folder_depth int, ts decimal(18,0)) Insert into @table (user_id , event_code , total_bookmarks , total_folders , folder_depth , ts) Values (0,8,34,6,1,128926), (0,8,34,6,1,129001), (4, 8, 18 , 2, 1, 123870), (6, 8, 30, 2, 1, 130099), (6, 8, 30, 2, 1, 132000), (6, 8, 30, 2, 1, 147778) Select * from @table Select user_id,event_code,total_bookmarks,total_folders,folder_depth,ts From ( Select RANK() over (Partition by user_id Order by ts desc ) as Rank, user_id,event_code,total_bookmarks,total_folders,folder_depth,ts From @table ) D1 Where D1.Rank = 1 特别禁止Observable.from()作为它接受的内容。所以第一种方法是创建一个可观察的返回null。 (尽管如此,请参阅已接受的答案。)

更好(更短)的方式是使用just

null

但我无法找到它的位置或如何导入它。

return Observable.just( array ? [] : null );

这并不存在于我的rxjs发行版中 修改: import 'rxjs/add/operator/just'; 已重命名为just,请参阅接受的答案。

答案 2 :(得分:0)

当你返回一个数组时,差异是'create / next'将立即发出整个数组,但'from'会发出每个项目的长度,因此对于订阅者来说,

Observable.create(observer => observer.next(myArray))将触发onNext事件一次以返回myArray,而Observable.from(myArray)将发出许多onNext事件以每次返回一个项目。

答案 3 :(得分:0)

Observable.from():
您有一个值列表(与Rx无关),并且从该列表 创建了一个Observable。当观察者订阅该Observable时,值列表将作为Next()事件一个接一个地传递,然后最终传递Completed(),您将无法控制此过程。

Observable.create():
通过将事件列表(而不是值)传递给观察者来创建观察者。您可以控制事件的顺序。如果您未调用onCompleted,则不会自动调用它。您可以故意在两个事件之间调用onError(用于测试)。