get 方法在 Angular 中完成获取信息后如何运行函数?

Posted

技术标签:

【中文标题】get 方法在 Angular 中完成获取信息后如何运行函数?【英文标题】:How can I run a function after a get method completes fetching information in Angular? 【发布时间】:2019-02-27 14:48:36 【问题描述】:

我有一个从我的 mongodb 获取数据的 get 函数。 GET 函数需要几秒钟才能运行。同时,应该下一个运行并处理获取的对象数组的函数不会等待数组并运行给出错误。 一旦我的 GET 函数完成执行,有什么方法可以运行该函数?

当我点击页面上的下载按钮时,downloadVMclicked 就会运行。

downloadVMclicked(ctype)
     console.log("ctype ="+ctype)
     var vms= new Array<VM>();
     vms=[]
    this.clusters.forEach(element => 
      if(element.ctype==ctype)
      
        this.inventoryService.getVMdownload(element.cname).subscribe(vmD =>
          console.log("Concating this.vms "+vms+" vmDownload "+vmD)
          vms=vms.concat(vmD)
          console.log("vms length is"+vms.length)
          if(vms!=null)
          
            console.log("VM downloaded for "+element.cname)
            console.log(vms)
           
          else
            console.log("VM not downloaded for "+element.cname)
        )
      
    )
    this.download(vms);
   

download(array)    
    console.log("Downloading "+ array.length+" items")
    var csvData = this.ConvertToCSV(array);
    var time = new Date();
    var a = document.createElement("a");
    a.setAttribute('style', 'display:none;');
    document.body.appendChild(a);
    var blob = new Blob([csvData],  type: 'text/csv' );
    var url= window.URL.createObjectURL(blob);
    a.href = url;
    a.download = 'vmAll '+time.toString()+'.csv';/* your file name*/
    a.click();
    return 'success';
   

【问题讨论】:

如何获取数据?分享您的代码以供我们理解 当然:service.get().subscribe(array =&gt; doSomethingWithTheArray(array)) 编辑您的帖子以添加代码;) 你的数据不可能到达this.dowload。因为您首先使用 loop,然后使用 subscribeloop 总是 faster 然后 subscribe 所以 vms 的数据永远不会到达或部分到达。您只需要更改代码并找出更好的方法。这可以是一个选项***.com/questions/44752086/… How to wait for subscriptions inside a for loop to complete before proceeding的可能重复 【参考方案1】:

检查结果是否已经到达,如果是,则创建一个新的promise并用结果完成它。

httpGet(url) 
    if(result === undefined) 
      return this.http.get(url).toPromise().then(
          result => this.result = result.json(),
          error => console.log(error);
      );
     else 
      return new Promise().resolve(result);
    

【讨论】:

我对 Angular 还很陌生,之前没有使用过 Promise。我在 Angular.io 上找不到任何关于 Promises 的信息。有没有其他网站可以找到相关信息? 有很多博客和帖子,你可以查看“medium”,也可以genuitec.com/angular-observables-and-promises你可以找到更多关于 observables/proimise 的细节 您好,我对您发布的代码有疑问。如果结果未定义,那么您要将结果更改为 JSON?你能解释一下你的代码吗? - @T.Shashwat

以上是关于get 方法在 Angular 中完成获取信息后如何运行函数?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security登录成功后如何处理用户信息

Angular 2 Http GET 的问题

angular ui-router:在解析中获取 toState 的 $state 信息

angular中get方法URL无法正确传输

angular4:无法使用 httpclient get 获取响应字符串

下载数据后如何处理更新小部件然后打开活动