如何在service外访问this.transactionDetailArtifact并赋值给dataTransaction
问题根因
这是异步编程的典型执行顺序问题:
this.Service.getDealTransactionDetailsArtifact是异步接口请求,调用subscribe注册回调后,程序不会等待接口返回结果,会直接继续执行后续的console.log、构造state、调用gotoDetails的逻辑- 接口成功返回后才会执行
subscribe内的回调给this.transactionDetailArtifact赋值,此时你早已经完成了dataTransaction的赋值和页面跳转,所以拿到的是初始的null值
解决方案
方案1:将依赖异步结果的逻辑移入回调(改动最小,推荐)
把需要用到transactionDetailArtifact的逻辑都放到请求成功的回调中,同时单独处理非Open状态的分支,保证两种场景执行逻辑一致:
edit(data:any){ // 非Open状态直接走原有逻辑 if(data.status !== 'Open'){ const state = { data: { dataTransaction: this.transaction, }, } this.gotoDetails(state); return; } // Open状态等接口返回后再执行后续逻辑 this.Service.getDealTransactionDetailsArtifact(this.accountId,this.transaction.id).subscribe( res => { this.transactionDetailArtifact = res.data; console.log(" this.transactionDetailArtifact" , this.transactionDetailArtifact) const state = { data: { dataTransaction: this.transactionDetailArtifact, }, } this.gotoDetails(state); }, err => { console.error(err); // 可按需添加请求失败兜底逻辑,比如用this.transaction兜底或弹出错误提示 } ) }
方案2:用async/await优化写法(可选,逻辑更直观)
RxJS 6+ 版本可以通过lastValueFrom把Observable转成Promise,用async/await写法避免回调嵌套,逻辑更易读:
// 先引入依赖 import { lastValueFrom } from 'rxjs'; async edit(data:any){ let dataTransaction = this.transaction; if(data.status === 'Open'){ try { const res = await lastValueFrom( this.Service.getDealTransactionDetailsArtifact(this.accountId,this.transaction.id) ); this.transactionDetailArtifact = res.data; dataTransaction = this.transactionDetailArtifact; console.log(" this.transactionDetailArtifact" , this.transactionDetailArtifact) } catch (err) { console.error(err); // 按需添加兜底逻辑 } } const state = { data: { dataTransaction }, } this.gotoDetails(state); }
注意:如果你的RxJS版本较低,可使用
toPromise()替代lastValueFrom,该方法在RxJS 7中被标记为废弃,高版本推荐用lastValueFrom
内容的提问来源于stack exchange,提问作者user17418363
相关产品推荐
相关产品推荐

