Angular 2多个Observables对JIRA REST API的异步请求

时间:2016-11-28 10:50:15

标签: rest angular jira observable

Hello Guys我有以下问题:

我需要向我的JIRA-Server发送多个POST-Requets来创建子任务问题。这是我的代码:

  this.js.createEpic().subscribe(res => {

  this.js.createWorkPackages(res.key, 'CR XYZ | v1.x | Setup - Template').subscribe(res => {

  })

  this.js.createWorkPackages(res.key, 'CR XYZ | v1.x | Implementation - Template').subscribe(res => {

  })

  this.js.createWorkPackages(res.key, 'CR XYZ | v1.x | Test Preparation - Template').subscribe(res => {

  })

问题是请求没有在订单中完成。我知道他们是异步的。但在JIRA中,票证订单依赖于,首先创建哪个票证。所以我需要我的门票这个订单。有可能这样做吗?我不想同步地执行请求,所以当第一个请求完成时我会调用第二个请求...这需要花费很多时间,因为我有很多子标记。

Summaray:我想要JIRA的异步请求,但是需要精确的Finishing-Order。希望你能帮助我...抱歉我的英语不好

1 个答案:

答案 0 :(得分:0)

如果您尝试同时触发每个请求并等待每个请求完成,请按以下步骤操作:

let setup$ = this.js.createWorkPackages(res.key, 'CR XYZ | v1.x | Setup - Template');

let implementation$ = this.js.createWorkPackages(res.key, 'CR XYZ | v1.x | Implementation - Template');

let test$ = this.js.createWorkPackages(res.key, 'CR XYZ | v1.x | Test Preparation - Template');

// launch the 3 requests at the same time
// and wait for the 3 answers before doing anything
setup$
  .combineLatest(implementation$, test$)
  .map(values => {
    // you now have access to the result of every request
    const [setup, implementation, test] = values;

    console.log(
      setup,
      implementation,
      test
    );
  })
  .subscribe();

警告:

请记住,Angular2不会自动取消订阅(除非您使用async管道)。

所以你应该像那样保存setup$....subscribe();

private requestSubscription: Subscription;

...

this.requestSubscription = setup$....subscribe();

在你的ngOnDestroy方法中调用unsubscribe:

this.requestSubscription.unsubscribe();

编辑1: 回应评论:

  

是的,但第二个请求只会在第一个请求完成时开始。所以我们不能兼职并节省时间..

不,两个请求将同时被触发并并行执行。

这是一个演示:

let d1 = Math.floor(Date.now());

let r1 = Rx
  .Observable.of('First request response')
  .do(x => console.log('Starting request 1 (will take 2s)'))
  .delay(2000);
  
let r2 = Rx
  .Observable.of('Second request response')
  .do(x => console.log('Starting request 2 (will take 5s)'))
  .delay(5000);
  

r1.combineLatest(r2).map(([val1, val2]) => {
  let d2 = Math.floor(Date.now());
  
  console.log('Both request are now done');
  console.log('It took : ' + (d2 - d1) + ' ms in total');
  
  console.warn('Response from request 1 :');
  console.log(val1);
  console.warn('Response from request 2');
  console.log(val2);
}).subscribe();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://npmcdn.com/rxjs@5.0.0-beta.7/bundles/Rx.umd.js"></script>

enter image description here

正如您在演示结果中看到的那样,两个请求的起始时间仅为2毫秒。

当请求1占用2s,请求2占用5s时,我们在5s后发出消息说已经完成了。

所以是的,两个请求都被同时发出,我们等待两个请求完成。