Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 等待可观察订阅的成功承诺()_Angular_Typescript - Fatal编程技术网

Angular 等待可观察订阅的成功承诺()

Angular 等待可观察订阅的成功承诺(),angular,typescript,Angular,Typescript,免责声明:这是我正在上课的练习的一部分,但我的导师知道这是否重要 基本上,我需要在我的组件中编写一个方法。提供所有其他服务。首先,我也同意一个可观察的观点。它发出一个值。然后我必须将该值传递给一个承诺,该承诺返回一个数组 然后,当它全部完成时,我必须控制台.log('done')。现在我的问题是,在承诺仍在得到解决的情况下,订阅的未完成(即())。这是我的尝试。recordList最终确实包含了正确的结果,但如果到达完整的片段,则首先将“完成”输出到控制台 let recordList = []

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

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

然后,当它全部完成时,我必须控制台.log('done')。现在我的问题是,在承诺仍在得到解决的情况下,订阅的未完成(即())。这是我的尝试。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')
      }
    )

}

使用可观察的。从承诺

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

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

    loadData(): Promise<any> {

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

            });
        });
      }
loadData():承诺{
返回新承诺((解决、拒绝)=>{
this.dataService.getRecord().subscribe(d=>{
...
决议(d)
},
(错误:HttpErrorResponse)=>{
...
拒绝(错误);
});
});
}

您是否必须将您的逻辑放入
subscribe
回调中?一般来说,最好是
管道
您的逻辑。这将允许您从
承诺
创建一个可观察的,并在它返回后执行所需的任何逻辑。@WillAlexander感谢您的输入。在你的评论之后,我正在阅读关于管道的文章。你介意分享一个你将如何处理它的示例代码吗?非常感谢。