サーバーにリクエストを送信し、観察可能な応答を取得します。データ内には、別のドキュメントを参照するIDがあり、データをフェッチして親Observableのデータを追加するために別のリクエストを送信する必要があります。これを達成する方法は?
Promiseでは、async / awaitを使用してこれを行うことができますが、Observablesを使用してこれを実現する方法を知りたいです
有望なサンプル
async func_name() {
let data1 = await <first_server_call_returns_promise>();
let data2 = await <second_call_with_data1.id_returns_promise>();
data1.value = data2;
return data1;
}
Observablesで上記を達成する方法は?
編集1
@TeddySterneの返信に基づいて、私が書いたコードは以下のとおりですが、実際のデータではなくサブスクライブ内でオブザーバブルを取得しているため、オブザーバブルをhtmlに割り当てることができません。
this.blogDoc.snapshotChanges().pipe(
exhaustMap((blogs) => {
return blogs.map(blog => {
const data = blog.payload.doc.data();
const id = blog.payload.doc.id;
return this.userService.getUserById(data.uid).pipe(
map((user) => {
const name = user.name;
return { id, name, ...data}
}),
)
})
}),
)
.subscribe(finalData => {
finalData.subscribe(data => console.log(data));
});
編集2
以下は私が今持っている更新されたコードです
this.blogDoc.snapshotChanges().pipe(
exhaustMap((blogs: any[]) => {
return zip(blogs.map((blog) => {
const data = blog.payload.doc.data();
const id = blog.payload.doc.id;
console.log(data);
return this.userService.getUserById(data.uid).pipe(
map((value) => {
console.log(value);
return value;
})
)
})).pipe(first())
})
).subscribe(values => console.log("Values: ", values));
console.log(data)
正しくデータを出力しますが、console.log(value)
印刷されたり取得されていませんconsole.log("Values: ", values)
subscribe onを使用するthis.userService.getUserById(data.uid)
と、期待されるシングルユーザードキュメントが返されます。
ここで何が欠けていますか?
を使用しexhaustMap
てデータを2番目のhttp呼び出しにパイプし、データが戻ってきたときにデータをマージできます。
import { zip } from 'rxjs/observable/zip';
this.http.get('/data1').pipe(
exhaustMap((data1Arr: any[]) => {
return zip(...data1Arr.map((data1) => {
return this.http.get('/data2/' + data1.id).pipe(
map((data2) => {
data1.value = data2;
return data1;
}),
);
}).pipe(first());
}),
).subscribe((fullQualifiedData) => {
// do stuff with the data
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加