【问题标题】:wait for a promise in success() of an observable subscription等待可观察订阅的 success() 中的承诺
【发布时间】:2019-09-03 23:17:01
【问题描述】:

免责声明:这是我正在上课的练习的一部分,但我的老师知道这是否重要。

基本上,我需要在我的组件中编写一个方法。提供所有其他服务。首先,我也订阅了一个 observable。它发出一个值。然后我必须将该值传递给返回数组的 promise。

然后我必须在全部完成后 console.log('done') 。现在我的问题是订阅的 onComplete 即 () ,而承诺仍在解决。这是我的尝试。 recordList 最后确实包含了正确的结果,但它是完整的部分,首先将“完成”输出到控制台。

let recordList = [];

public loadData() {

  let vm: any = this;

    this.dataService.getRecord().subscribe(
      record => {
       // record is now a single dictionary object
       // {'type': 'bookkeeping', 'id': 1}

       // for each record type, get its list of attached data

       record['data'] = []; // in case it has not record

        vm.dataService.recordDetails(record.id).then(recordData => {
            // recordData is an array
         record['data']  = recordData
          vm.recordList.push(record);
        });
      },
      err => {
        console.log("error getting record");

      },

      () => {
        console.log('done')
      }
    )

}

【问题讨论】:

  • 你必须把你的逻辑放在subscribe回调中吗?一般来说,最好pipe你的逻辑。这将允许您从 Promise 创建一个 Observable,并在它返回后执行所需的任何逻辑。
  • @WillAlexander 感谢您的意见。在您发表评论后,我正在阅读有关管道的信息。你介意分享一个关于如何处理它的示例代码吗?谢谢。

标签: angular typescript


【解决方案1】:

使用 Observable.fromPromise,

 this.dataService.getRecord().switchMap(record => {
   record['data'] = [];
   return Observable.fromPromise(vm.dataService.recordDetails(record.id));
 }).subscribe((recordData ) => {
 record['data']  = recordData
   vm.recordList.push(record);
 });

【讨论】:

    【解决方案2】:

    你需要返回一个 Promise 并解决或拒绝:

        loadData(): Promise<any> {
    
            return new Promise((resolve, reject) => {
               this.dataService.getRecord().subscribe(d => {
    ...
                 resolve(d)
                },
                (err: HttpErrorResponse) => {
                 ...
                    reject(err.error);
    
                });
            });
          }
    

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2016-04-14
      • 1970-01-01
      • 2021-06-14
      相关资源
      最近更新 更多