如何使用Observable级联AJAX多种方法

时间:2017-01-05 15:05:57

标签: rxjs5

live exmaple

我原本预计它会按顺序打印:

  • 在发送Ajax结果之前打开“加载”屏幕
  • 获取AJAX结果和记录
  • 关闭加载屏幕

可以执行以下代码,我想询问是否还有其他方法可以编写



var openLoadingPage$ = Rx.Observable.create(function(observer) {
  console.log("open...");
  observer.complete();
});

var closeLoadingPage$ = Rx.Observable.create(function(observer) {
  console.log("close..");
  observer.complete();
});

var ajax$ = Rx.Observable.create(function(observer) {
  //todo:get ajax result
  observer.next("hello world");
  observer.complete();
});

var result$ = Rx.Observable.of(
    openLoadingPage$,
    ajax$.delay(2000),
    closeLoadingPage$)
  .concatAll();

result$.subscribe({
  next: (value) => {
    console.log("get ajax result:", value);
  }
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.js"></script>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

请注意,当您编写Rx.Observable.of(myFunc1())时,myFunc1会立即执行,其返回值(undefined在您的情况下,因为它没有)将是单个事件值观察到。

(与subscribe相同的问题,当您传递console.log("complete")的返回值时,会接受回调

最后一部分写.subscribe(() => console.log("complete"))可能会取得更大的成功。

对于func部分,很难说出你想要实现的目标,但这是一次尝试:

function myFunc1() {
  console.log("myFunc subscribe called");
  return "f1"
}

function myFunc2() {
  console.log("myFunc2 subscribe called");
  return "f2"
}

var myFunc1$ = Rx.Observable.defer(() => Rx.Observable.of(myFunc1()));
var myFunc2$ = Rx.Observable.defer(() => Rx.Observable.of(myFunc2()));

myFunc1$
  .delay(2000)
  .concat(myFunc2$)
  .subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.js"></script>