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)


Ответы (0 шт):