Angular 5 - подписка на Observable после функции обратного вызова (подписка не может читать подписку на свойство undefined)

Я должен вернуть наблюдаемый ответ моему родительскому компоненту после выполнения функции обратного вызова.

если я поставлю return this._httpService.insertRMS (url, body); без обратного вызова, я смогу получить ответ независимо от успеха или ошибки.

Как я понял, можно использовать подписку, только в наблюдаемом типе ответа. доступен ли любой другой для получения наблюдаемого ответа после выполнения функции обратного вызова.

Я написал функцию getParcelInfo внутри функции обратного вызова из-за предотвращения дублирования, так как она требует много раз для других функций  введите описание изображения здесь

comp1.ts

parcelinfo(){
this._pmsToRMSService.createOrderDelivery(351).subscribe(//Error
  response => {
    alert("success");
  },
  error => {
    alert("error");
  });
}

comp2.ts

@Injectable()
export class PMSToRMSService {

private getParcelInfo(parcelid, callback): any {

    let url = serviceAPI.urlParcel + parcelid;
    this._httpService.getData(url).subscribe(
        response => {
            callback(response);
        },
        error => {
            callback(error);
        });
}

public createOrderDelivery(parcelid: number): Observable<any> {

   return this.getParcelInfo(parcelid, pmsResponse => {          

                let body = pmsResponse;

                let url = serviceAPI.urlRMSCreateOrder;

                return this._httpService.insertRMS(url, body);//Output Need
});
}

}


person Arun A    schedule 12.02.2018    source источник
comment
Я следил за этой статьей и решил проблему ... stackoverflow.com/questions/46326446/   -  person Arun A    schedule 12.02.2018


Ответы (1)


private getParcelInfo(parcelid, callback): any {

    let url = serviceAPI.urlParcel + parcelid;
    this._httpService.getData(url).subscribe(
        response => {
            callback(response);
        },
        error => {
            callback(error);
        });
}

Функция getParcelInfo ничего не возвращает, как было предложено в сообщении об ошибке. Также вы делаете здесь подписку (вы вызываете метод подписки), имея в виду, что вы можете вернуть (если вы добавите ключевое слово return) объект подписки вместо Observable (позаботьтесь об этом).

Вот как должно выглядеть:

@Injectable()
export class PMSToRMSService {

private getParcelInfo(parcelid, callback): any {
    let url = serviceAPI.urlParcel + parcelid;
    return this._httpService.getData(url)
        .do(response => callback(response),
            error => callback(error));
}

public createOrderDelivery(parcelid: number): Observable<any> {
   return this.getParcelInfo(parcelid, pmsResponse => {
                let body = pmsResponse;
                let url = serviceAPI.urlRMSCreateOrder;
                return this._httpService.insertRMS(url, body);
          });
   }
}
person Luillyfe    schedule 12.02.2018
comment
Этот возвращает ответ getParcelInfo вместо insertRMS. Я погуглил и реализовал switchMap, теперь все в порядке. - person Arun A; 13.02.2018