【问题标题】:Rxjs Promise like Observable像 Observable 一样的 Rxjs Promise
【发布时间】:2015-06-12 12:55:07
【问题描述】:

我想找一张收据,以提供Promiselike Observable
我的意思是: Observable 提供单个值并完成,
并且任何订阅者(完成之前和之后)都应该获得该单一值。
我提出了Rx.Observable.createpublishLastconnect 的组合。

var getPromiseLike=function(){
  console.log('getPromiseLike()');
  //// var an_object={}; <--- this should happen inside Obs function
  var prom_like = Rx.Observable.create(function(obs) {
    var an_object={};   /// <--- here !
    setTimeout(function(){
      obs.onNext(an_object);
      obs.onCompleted();
    },500);
  }).publishLast();
  prom_like.connect();
  return prom_like;
};

var promiselike=getPromiseLike();

var obj1;
promiselike
  .subscribe(function(obj){
    console.log('onNext1');
    obj1 = obj;
  },
  function(err){},
  function(){
    console.log('onComplete1');
  });


setTimeout(function(){
  promiselike
    .subscribe(function(obj){
      console.log('onNext2 obj1===obj :'+(obj1===obj)); //true
    },
    function(err){},
    function(){
      console.log('onComplete2');
    });
},1000);

/*LOGS:
getPromiseLike()
script.js:19 onNext1
script.js:24 onComplete1
script.js:31 onNext2 obj1===obj :true
script.js:35 onComplete2
*/

这是最简单的解决方案还是我错过了一些内置的? plnkr

【问题讨论】:

标签: promise rxjs


【解决方案1】:

在 RxJS 中,类似 promise 的构造通常使用 AsyncSubject 建模。

它具有许多 Promise 所具有且有用的属性:

  • 它只接收一个值,如 Promise,并且只会使用该值调用 next。
  • 它会缓存该值以供将来所有计算使用。
  • 它是一个 Subject,所以它在某些 Promise 库中类似于一个延迟。

注意:我个人认为将 Promise 与 observables 混合没有问题,我在自己的代码中这样做,并且 Rx 很好地使用了 Promise。

【讨论】:

  • 就是这样!我昨天发现了,.. 它的使用非常简单,只是,必须注意调用onCompleted,因为订阅者将在完成之前专门收到最后一个值。 Promises 之间的区别在于AsyncSubject 不受保护,这意味着消费者可以访问其onXxx 方法。-是的,我知道Rxjs 通常透明地处理承诺,但我当我了解Rx 拥抱该范例本身时,试图避免添加一个库
  • AsyncSubject 不受保护是否可以成为允许取消的有目的的机制?
  • 查看github.com/Reactive-Extensions/Rx.NET/blob/master/Rx.NET/Source/… 的代码,看来情况可能如此。我似乎无法通过谷歌找到Cancel(..) 方法。也许我会下载源代码,稍后再做一个 find 声明。
  • @Benjamin-Gruenbaum 您如何看待使用任何 Observable.from*() 函数或 .toAsync() 创建 Observable 然后调用 .take(1) 进行过滤的方法到序列中的单个元素?不得不在 AsyncSubject 上调用 onCompleted() 以模拟 Promise 的行为,这对我来说是个遗憾。
  • @DWoldrich 所以只需使用带有fromPromise 的promise 或直接在组合器中使用。
猜你喜欢
  • 2017-11-25
  • 2016-12-25
  • 2018-02-19
  • 2018-02-05
  • 2017-06-14
  • 2019-05-31
  • 2016-12-11
  • 2017-05-04
  • 1970-01-01
相关资源
最近更新 更多