Angular 5 - 在回调函数之后订阅Observable(subscribe无法读取未定义的属性订阅)

时间:2018-02-12 15:46:33

标签: observable angular5 subscribe

在执行回调函数后,我必须返回对父组件的可观察响应。

如果我把返回this._httpService.insertRMS(url,body); 没有回调,我能够得到响应,无论成功或错误。

据我所知,只能在可观察的响应类型中使用subscribe。在执行回调函数后,任何其他可用于消耗可观察的响应。

我在回调函数中写了 getParcelInfo 函数,因为重复避免,因为它需要这么多次才能实现其他功能enter image description here

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
});
}

}

1 个答案:

答案 0 :(得分:0)

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);
          });
   }
}