RxJs очередь асинхронных действий. Как проще написать мой код?
Есть такое страшилище. Не могу найти как при помощи RxJs упростить запись последовательностей асинхронных действий.
public buyMedia(mediaId:number, customerId:number):Observable<any>{
this.log("buy media id "+mediaId+" customerId "+customerId);
return Observable.create(observer=>{
// получение из одной таблицы БД данных
this.dbService.getUserMediaById(mediaId).subscribe(data=>{
if(data.result == "OK"){
const customer:User = ChatManagerService.getInstance().getUser(customerId.toString());
if(!customer){
observer.next({result:"ERROR", error:"Customer by id "+customerId+" not found"});
}
this.log("detecting purchase already exists. mediaId="+mediaId+" customerId="+customerId);
// проверка в другой таблице БД условия, был ли уже куплен этот товар
this.dbService.detectPurchaseExists(mediaId, customerId).subscribe(data=>{
this.log("purchase already exists response: "+JSON.stringify(data));
const purchaseExists:boolean = data.exists;
if(!purchaseExists){
// обращение к сервису, который принимает оплаты
this.createMediaPayment(cost, mediaOwnerId, customer).subscribe(paymentResponseData=>{
if(paymentResponseData.result == "OK"){
// сохраннеие в БД записи о том что такой-то товар был куплет
this.createPurchaseDBRecord(mediaId, customerId).subscribe(dbCreatePurchaseData=>{
if(dbCreatePurchaseData.result == "OK"){
console.log("create purchase record dbCreatePurchaseData=",dbCreatePurchaseData);
// увеличение в БД счетчика продаж определенного товара
this.dbService.incrementPurchasesAttribute(mediaId).subscribe(incrementData => {
if(incrementData.result == "OK"){
const responseData:any = {result: "OK", media:{id: mediaId, url:userMedia.url, date:userMedia.date, approved:1, cost:cost, previewUrl:"", stillUrl:"", type:0, userId:mediaOwnerId}, date: dbCreatePurchaseData.date};
observer.next(responseData);
}
else{
observer.next(incrementData);
}
});
}
else{
observer.next(dbCreatePurchaseData);
}
});
this.log("sending media has been bought to telegram bot");
// получения данных из таблицы в БД для отсылки телеграм ботом
this.dbService.getUserMediaById(mediaId).subscribe(userMediaData => {
if(userMediaData.result == "OK"){
const ownerId:number = parseInt(userMediaData.userMedia.userId);
const mediaType:number = parseInt(userMediaData.userMedia.type);
let preview:string = APP_BASE_PATH + userMediaData.userMedia.stillUrl;
this.telegramBot.sendUserMediaBought(parseInt(customer.getId()), ownerId, preview, mediaType, cost);
}
});
}
else{
observer.next(paymentResponseData);
}
});
}
else{
observer.next({result:"ERROR", error:"Media id "+mediaId+" already bought"});
}
});
}
else{
observer.next(data);
}
});
});
}
Или проще: service1, service2, service3
Мне нужно, чтобы я запустил service1.method(), получил ответ (response_1), если он без ошибки, то выбрал из ответа данные, запустил service2.method(response_1), дождался ответ (response_2), если он без ошибки, то выбрал из ответа данные, запустил service3.method(response_2), дождался ответ (response_3)