【问题标题】:Angular 8: Run Component Class Methods Synchronously/SequentiallyAngular 8:同步/顺序运行组件类方法
【发布时间】:2020-03-08 23:03:22
【问题描述】:

如何在 Angular Typescript 中同步运行方法? 这些不是函数,而是方法。 第一个调用服务,然后第二个保存到数组中。

runTwoMethods()
{
  this.validateAddress();
  this.saveJsonArchive();
}

验证地址可能会调用更多的子方法,甚至可能不是Api,所以要等到一切都完成后再保存。

以下语法用于函数,目前正在搜索类方法,

Angular / TypeScript - Call a function after another one has been completed

最后,数据被存储到当前数据对象中。我想成为 保存到存档。也许另一种可能性,我如何保持 AddressCurrentMailing 和 JSONArchive[2] 同步?

当前Data对象来源于API,不确定在哪里(也不允许我编辑API,然后调用转换),然后想保存到JsonArchive中。

 this.jsonArchive[this.jsonArchiveCounter] = this.addressCurrentMailingFinalData

【问题讨论】:

  • validateAddress 返回什么?
  • 嗨@PierreDuc 它调用了一些服务,但是是一个无效的方法,什么都没有
  • 那么(完全)不可能,您应该从该方法返回一个promise或一个observable,以便能够异步调用下一个
  • 我刚刚写了最终目标

标签: javascript angular typescript angular8


【解决方案1】:

您可以使用Observable 作为第一个,并在回调中使用Subscribe 之后的第二个方法:

validateAddress(): Observable<Someclassname>
{
    return this._http.get<Someclassname>('url');
}

this.yourService.validateAddress().subscribe(
                (result) => { 
                  this.saveJsonArchive();
                },
                (error) => console.log('NO saveJsonArchive'));

编辑validateAddress 和多个Observable

const ox: Observable<Someclassname>[] = [];
ox.push(this.http.get<Someclassname>(url1));
ox.push(this.http.get<Someclassname>(url2));
ox.push(this.http.get<Someclassname>(url3));
forkJoin(ox).subscribe(result => this.saveJsonArchive());

【讨论】:

  • 你能概括一下吗?这个验证地址可能会调用更多的子方法,甚至可能不是一个api,所以我想等到一切都完成后再保存然后运行谢谢
  • @SailorLuvBoat 您需要使用 rxjs 函数,以便将 validateAddress() 中的所有内容封装到可观察对象中。如果您在 validateAddress() 中显示您拥有的代码,我们可以为您提供帮助
  • validateAddress 中,您可以拥有多个Observable 并在// 中运行全部,然后在您取消forkJoin 之后。
【解决方案2】:

你可以在 "this.validateAddress();" 中返回一个 Promise并等待它。

我假设你使用 Angular HttpClient。

例如:

private validateAddress(): Promise<someclassname>
{
    return this._http.get<someclassname>("someurl").toPromise()
}


async addSeasonal()
{
    await this.validateAddress();
    await this.saveJsonArchive();
}

我希望这会有所帮助。

【讨论】:

  • 你能概括一下吗?这个验证地址可能会调用更多的子方法,甚至可能不是一个api,所以我想等到一切都完成后再保存然后运行
  • 另外,为什么我必须编辑子方法?我可以在组合方法中对每个子方法执行 Promise 吗?
  • 每个方法默认同步运行。不同之处在于与 httpClient 的 http 调用不会同步运行。他们返回一个可观察的。最简单的方法是将其转换为所描述的承诺并等待它(或使用.then((returnValue) =&gt; {}) 给它一个回调。
  • 验证地址,实际上并不调用api,它里面的很多其他方法都可以
  • 将 observables 转换为 Promise 是一种反模式。只需将 observable 和管道返回到forkJoin/switchMap/map/whatever
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多