[英]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.