繁体   English   中英

Angular - 订阅返回

[英]Angular - Return from subscribe

我正在尝试使用订阅将值返回给 this.voucherDetails 但它似乎不起作用。

以下是对 function getVoucherDetails的请求,它具有订阅 function。

voucherIDs: string[];
voucherDetails: Promise<any>[];

this.voucherIDs = ['JV-2005-50','JV-2005-40','JV-2005-30'];
this.voucherDetails = this.voucherIDs
.map(id => this.getVoucherDetails(id));
Promise.all(this.voucherDetails)
      .then(() => this.printService.onDataReady());

以下是订阅 userService 的 function,它从数据库中获取数据。

getVoucherDetails(voucherid) {
    var splitvoucher = voucherid.split('-');
    var vouchertype = splitvoucher[0];
    var vouchermy = splitvoucher[1];
    var voucherno = splitvoucher[2];
    var vouchernotopass = vouchermy+"-"+voucherno;

    var voucherdate;
    var enteries;

    this.userService.getVoucher(vouchernotopass,vouchertype).subscribe(
        res => {
          voucherdate = res['voucherdate'];
          enteries = res['enteries'];
          return { "vouchertype":vouchertype, "vouchernumber": vouchernotopass, "voucherdate": voucherdate, "enteries":enteries};   
        }
    );       
}

但它返回undefined 在浏览了几篇文章后,我了解到您无法从 a.subscribe 返回。 但是我一直无法理解如何解决这个问题。

您正在与 Observable 异步工作,因此您需要使用回调,例如 Promise。您应该在您的方法中返回一个 Observable(或 Promise)并让调用者订阅它:

getVoucherDetails(voucherid) {
    var splitvoucher = voucherid.split('-');
    var vouchertype = splitvoucher[0];
    var vouchermy = splitvoucher[1];
    var voucherno = splitvoucher[2];
    var vouchernotopass = vouchermy+"-"+voucherno;

    var voucherdate;
    var enteries;

    return this.userService.getVoucher(vouchernotopass,vouchertype).pipe(
        map(res => {
          voucherdate = res['voucherdate'];
          enteries = res['enteries'];
          return { "vouchertype":vouchertype, "vouchernumber": vouchernotopass, "voucherdate": voucherdate, "enteries":enteries};   
        })
    );       
}

像这样使用这个方法:

getVoucherDetails(id).subscribe(v => {
  console.log(v.vouchertype);
  console.log(v.vouchernumber);
  console.log(v.voucherdate);
});

在你的情况下:

forkJoin( // forkJoin waits for Observables to complete and then combine last values they emitted.
   this.voucherIDs.map(id => this.getVoucherDetails(id) // array of observable
).subscribe(responses => {
   console.log(responses);
   this.voucherDetails = responses;
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM