2016-11-28 58 views
-1

你好家伙我有以下问题:2个多观测量异步请求JIRA REST API

我需要多重后Requets发送到我的JIRA,服务器与他们的子任务产生问题。这是我的代码:

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但与excact想整理订单。希望你能帮助我...对不起我的英文不好

+0

你要等待每个请求完成,然后做一些事情时,3个请求完成? – Maxime

+0

我希望第一个请求在第二个请求之前完成。但第二个请求不应该等待他的工作,而第一个请求还没有完成。但是当第二个请求在完成请求1之前完成他的工作时,他应该等到请求1给出回复。他们应该平行工作,但答案应该排队(他们称之为)。你明白了吗?我知道我不能解释它xD –

+0

老实说...我没有得到任何东西:D – Maxime

回答

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方法调用退订:

this.requestSubscription.unsubscribe(); 

编辑1: 在评论的回应:

是的,但第二个要求est只会在第一个完成时开始。因此,我们不能工作paralell和节省时间..

没有,无论是请求将被同时发射和并行执行。

这里有一个演示:

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/[email protected]/bundles/Rx.umd.js"></script>

enter image description here

正如你可以在演示的结果可以看出,无论是要求符合仅为2ms的时间差开始。

由于请求1花费2S,并要求2取5秒,我们有一个消息5S后来说,它的完成。

所以,是的,这两个请求被解雇同时,我们等待两到结束。

+0

首先感谢你的答案, 我已经试过了。问题仍然是一样的。同样在这种情况下,第二个POST请求可以早于请求1完成。然后Jira中的列表将如此:Package 2,Package 1.我想同时触发请求,因此它们可以并行工作。但请求2在请求1之前完成。神圣的人真的很想解释。但我甚至知道这是否有可能使 –

+0

在这里,他们同时被解雇,他们不会像你说的那样混淆。他们将按照这个顺序。 – Maxime

+0

是的,但第二个请求仅在第一个完成时开始。所以我们不能并行工作,节省时间... –