Rxjs承诺像Observable

时间:2015-06-12 12:55:08

标签: promise rxjs

我想找一张收据,提供Promise Observable的{​​{1}} 我的意思是: Observable提供单个值并完成,
任何订户(完成前后)都应获得该单一值 我推出了Rx.Observable.create publishLastconnect的组合。

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

1 个答案:

答案 0 :(得分:6)

在RxJS中,通常使用AsyncSubject来构建类似构造的承诺。

它有许多承诺具有并且有用的属性:

  • 它只接收一个像promise一样的值,并且只会使用该值调用next。
  • 它为所有未来的计算缓存该值。
  • 这是一个主题,所以它就像是在一些承诺库中推迟。

注意:我个人认为将promises与observable混合没有问题,我在自己的代码中做到这一点,Rx很好地使用了promises。