等待观察到的订阅成功()中的承诺

时间:2019-09-03 11:14:03

标签: angular typescript

免责声明:这是我正在参加的课程的一部分练习,但是我的教练知道这是否重要。

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

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

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')
      }
    )

}

2 个答案:

答案 0 :(得分:0)

使用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);
 });

答案 1 :(得分:0)

您需要返回承诺并解决或拒绝:

    loadData(): Promise<any> {

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

            });
        });
      }