2017-12-21 18 views
1

Observablesを使用してユーザーを印刷する方法を理解するのが難しいです。今は、リクエストが解決された時点によって、順不同で印刷されます。それをどのようにして順番に印刷するのですか?ルーピング時に観測可能な値を順番に取得していますか?

printUsersInOrder() { 
    for (var i = 0; i < 10; i++) { 
    this.getUser(i) 
    } 
} 

// kibanaService uses angular2/http 
getUser(userId: int) { 
    this.kibanaService.getUser(userId).subscribe(
    res => { 
     console.log(userId) 
     console.log(res) 
    }, 
    err => { 
     console.log(err); 
    } 
    } 
); 
+0

このページでは、同じ問題について話しています。これを確認してください。 https://stackoverflow.com/questions/44974036/angular2-observable-getting-data-from-list-out-of-order

+0

ここをクリックしてください:https://stackoverflow.com/questions/45798178/angular4-httpclient-many-requests-in-succession/45798433#45798433 – Fals

+0

[Angular4:HttpClient - 重複している可能性がある](https://stackoverflow.com/questions/45798178/angular4-httpclient-many-requests-in-succession) – Fals

答えて

2

combineLatest RxJsストリームを使用できます。あなたはherehereを見つけることができますcombineLatestの詳細については

printUsersInOrder() { 
    let requests = []; 
    let successfulResponses = []; // <-- Let's keep track of successful responses 
    for (var i = 0; i < 10; i++) { 
     requests.push(this.getUser(i).do(res => successfulResponses.push(res))) 
    } 

    Observable.combineLatest(requests) 
    .subscribe((responses)=>{ 
     // response array will have the same order as it is in the requests array 
     responses.map(res => console.log(res)) 
    }, (err) => { 
     console.log(successfulResponses) // <--- This will print all successful responses 
     console.log(err) 
    }) 
    } 

    // kibanaService uses angular2/http 
    getUser(userId: int) { 
    this.kibanaService.getUser(userId) 
    } 

+0

例外をキャッチする方法は分かりますか?エラーが発生した場合は、最新のものを組み合わせてください。 –

+0

ここで、 'console.log(err)'という行が書かれています。そこにエラーをキャッチすることができます。いずれかの要求が失敗した場合、エラーコールバックが呼び出されます。 – Karlen

+0

リクエストの4/5がうまくいけば - 私はまだ働いている4人の結果が欲しい。今は4つの仕事と1つが失敗すれば、私はすべての結果を失う。どのようなアイデアをするか? –

関連する問題