【问题标题】:Angular 5 - Asynchronous Service Calls in two different components (First Method Not waiting for DB response)Angular 5 - 两个不同组件中的异步服务调用(第一种方法不等待数据库响应)
【发布时间】:2019-07-26 19:53:59
【问题描述】:

我必须对单个(点击)事件执行两个不同的数据库事务。

第一次调用:将数据保存到数据库。

第二次调用:从数据库中获取第一次调用的保存数据

这些调用被分隔在两个不同的组件中,并处理一个公共数据库表。

我的方法如下:

第一个组件 TS:

ngOnDestroy(){ this.saveData(); }

第二个组件 TS:

ngOnInit(){ this.getSavedData(); }

第一个执行方法的服务调用:

 saveData(obj) {
    return this.http.post(environment.appUrl + 'saveDataApi', obj).toPromise()
      .then(res => <any>res); }

这两种方法都按编码顺序触发。但我的问题是 this.getSavedData();Save 方法的数据库事务完成并返回响应之前完成了它的数据库事务。

我需要“保存”方法的服务调用应该等待数据库响应,然后继续执行其他组件中的“获取”方法。

简而言之:除非this.SaveData(); 完成其整个执行并返回响应,否则不应执行this.getSavedData();

我错过了什么?

【问题讨论】:

  • 您能告诉我您的“getSavedData()”方法以及如何调用该方法吗?
  • TS : getSavedData() { this.dataService.getSavedData(this.obj).then(data => { if (data.lstRespObj[0] != null && data.lstRespObj[0].长度 > 0) { this.fetchedData = data.lstRespObj[0]; } }); } 服务:getSavedData(obj) { return this.http.post(environment.appUrl + 'getDataApi', obj).toPromise() .then(res => res); }

标签: angular asynchronous angular5 angular-observable


【解决方案1】:

如果负责获取数据的组件是保存数据的组件的子组件,我会推荐pass data from parent to child with input binding

否则,您可以创建一个共享服务来通知兄弟组件。

See my answer here

【讨论】:

  • 在我的情况下,获取数据的组件是父组件。我只想暂停 Angular 工作流,直到 Save 方法到达 DB Stored Proc 并返回响应。我有尝试设置超时,但这是暂时的逃避!
【解决方案2】:

您可能需要调用 onDestroy 类似下面的代码。

  async ngOnDestroy() {
    const res = await this.saveData(); 
  }

【讨论】:

  • 试过了..仍然表现相同..首先完成 getSavedData() :(
【解决方案3】:

创建一个名为data.service.ts(您希望的名称)的服务来处理HTTP 调用。创建一个saveData 方法。从第一个组件调用它(尽管我不确定 ngOnDestroy 是否是进行此类调用的最佳位置):

ngOnDestroy(){ this.dataService.saveData(); }

以在响应成功时从服务发出结果的方式实现您的服务:

@Injectable()
export class DataService {
  private _data$ = new ReplaySubject(1);
  public data$ = this._data$.asObservable();

  saveData(obj) {
    return this.http.post(environment.appUrl + 'saveDataApi', obj).pipe(
      tap(res => this._data$.next(res)
    )
      .toPromise()
      .then(res => <any>res); 
  }
}

在您的第二个组件中,订阅服务的 data$ Observable:

ngOnInit() {
  this.dataSubscription = this.dataService.data$.subscribe(() => [..])
}

离开组件时别忘了取消订阅:

ngOnDestroy() {
  this.dataSubscription.unsubscribe();
}

Or bind data$ to your template directly using the async pipe.
Maybe you should consider adding a state management framework to your application, like ngRX, but that is a bigger jump.

【讨论】:

  • 嘿..这工作得很好,但是如果我在运行会话中再次做同样的事情,我的'Get'调用会增加 +1.. 例如:Save();得到(); - 保存();得到();得到(); - - 保存();得到();得到(); Get();......你能告诉我在“Get”完成后取消订阅这个东西的方法吗?
  • 虽然我并没有破坏组件..需要其他地方取消订阅..
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多