2016-11-28 32 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

是的,但第二個請求僅在第一個完成時開始。所以我們不能並行工作,節省時間... –