如何等待在Angular中加载数据

时间:2020-08-11 14:18:54

标签: angular rxjs

在打开对话框窗口之前,我想加载数据:

const documents = await this.documentService.loadDocuments(this.application.reglamentid);
     this.documentService.setDocuments(documents);
     dialog.open();

服务为:

    export class DocumentService {
        private documents: any[] = [];
    
        constructor(private http: HttpClient) {}
    
        loadDocuments(reglamentId: number): Observable<any[]> {
            return this.http.get<Department[]>(`${environment.apiUrlDocuments}/Generation/documents?reglamentId=${reglamentId}`);
        }
    
        getDocuments() {
            return this.documents;
        }
    
        setDocuments(documents): void {
            this.documents = documents;
        }
    }

我只想等待响应,然后打开对话框窗口。

4 个答案:

答案 0 :(得分:1)

异步/等待要求被调用的方法返回一个Promise,而不是一个Observable。

您需要将loadDocuments(...)方法更改为:

async loadDocuments(reglamentId: number): Promise<any[]> {
  return this.http.get<Department[]>(`${environment.apiUrlDocuments}/Generation/documents?reglamentId=${reglamentId}`).toPromise();
}

答案 1 :(得分:1)

您可以使用订阅方法:

this.documentService.loadDocuments(this.application.reglamentid)
   .subscribe(documents => {
      this.documentService.setDocuments(documents);
      dialog.open();
   }

https://angular.io/guide/observables-in-angular#observables-in-angular

答案 2 :(得分:0)

您有两种选择来实现此功能。

将await与http请求一起使用。我认为您已尝试做。默认情况下,由于每个原因,Angular httpclient对于每个http请求都返回Observable,因此您必须将toPromise()添加到与此类似的http调用中

async loadDocuments(reglamentId: number): Observable<any[]> {
        return this.http.get<Department[]>(`${environment.apiUrlDocuments}/Generation/documents?reglamentId=${reglamentId}`).toPromise();
    }

这将返回一个等待的诺言,然后您可以使用已提供的代码。当然,调用方方法必须异步才能使用await。

如果您不想使用异步函数,请在我提供的服务中使用相同的代码,然后使用.then方法

this.documentService.loadDocuments(this.application.reglamentid).then((documents)=>{
   this.documentService.setDocuments(documents);
   dialog.open();
});

答案 3 :(得分:0)

关于您处于Angular环境中的事实,建议使用Observables。您可以在Observable上调用subscription方法来处理此问题。

要对Observable和Promise进行更多说明,主要区别是Observable可以表示为“流”而不是Promise,并且可以添加不同的操作来处理流(参见https:// rxjs .dev / guide / overview)。

了解可观察概念是Angular应用程序中必须具备的。