2017-07-24 46 views
1

我想在使用Ionic加载控制器时有一些帮助,同时有多个http调用在异步函数中处理。离子3 - 异步Http调用和离子加载问题

首先,这是我与承诺

LoadDatafromUrls(urLs) { 
 
    return new Promise((resolve, reject) => { 
 
     let loader = this.loadingCtrl.create({ 
 
     content: 'Son Bilgiler Alınıyor', 
 
     }); 
 
     var urlCalls = []; 
 
     urLs.forEach((entry: any) => { 
 
     loader.present().then(()=>{ 
 
      this.http.get(entry.url).map((response : Response)=>{ 
 
      console.log(response.json()); 
 
      urlCalls.push(response.json()); 
 
      }).subscribe(()=>{ 
 
      console.log("subscribe"); 
 
      }); 
 
      loader.dismiss(); 
 
     }) 
 
     }) 
 
     Promise.resolve(urlCalls).then((res)=>{ 
 
     console.log(res); 
 
     resolve(res); 
 
     }, 
 
     (res)=>{ 
 
     reject(res); 
 
     }) 
 
     //return Promise; 
 
    }) 
 
    }

其次,我把它用这种方式异步功能。

RequestObject.LoadDatafromUrls(urLs).then((results)=>{ 
 
     console.log(results); 
 
     }, 
 
     (errors)=>{ 
 
     console.log(errors); 
 
     })

在该方法中,我有下面的错误消息:

错误消息: “未捕获(在承诺):removeView未找到”。而且,它并不以我期待的方式工作。

我真的很开放,以completely新的方法,新的方式。请分享,如果我能有更好的实施。

回答

0

因为每次获得每次调用的响应后都隐藏加载程序。 Ionic在尝试关闭加载程序时会抛出此错误,但视图中没有加载程序。刚刚解雇装载机只有在所有的呼叫已经解决

loader.present(); 
urLs.forEach((entry: any) => { 
    // loader.present().then(()=>{ 
      urlCalls.push(this.http.get(entry.url).map((response : Response)=>{ 
      console.log(response.json()); 
      return response.json(); 
      }).subscribe(()=>{ 
      console.log("subscribe"); 
      }).toPromise()); 
     // loader.dismiss(); 
     }) 
    // }) 
Promise.all(urlCalls).then((res)=>{ 
     console.log(res); 
     resolve(res); 
     loader.dismiss() 
     }, 
     (res)=>{ 
     reject(res); 
     }) 

编辑: 如何使用解决多个观测?

getData(urls){ 
    var loader = this.loadingCtrl.create({ 
     content : "Loading..." 
    }); 
    loader.present(); 
    this.LoadDatafromUrls(urls).subscribe(res=>{ 
     console.log(res)//array of responses 
     loader.dismiss(); 
    },err=>{ 
     console.log(err);// it will fire if any one call fails 
     loader.dismiss(); 
     }); 
    } 
    LoadDatafromUrls(urls){ 
    var arrObservables = [];   
    for(var i = 0; i < urls.length; i++){ 
     arrObservables.push(this.http.get(urls[i]).map((res: Response)=>{ 
      return res.json() 
     }).catch((err: Response)=>{ 
      return Observable.throw(err); 
     })) 
    } 
    return Observable.forkJoin(arrObservables); 
    } 

记住:在组件中添加以下import语句:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/observable/throw'; 
import 'rxjs/add/observable/forkJoin' 
+0

我想你上面提到的方式。我将编辑关于反馈的评论。谢谢 ! – ozercevikaslan

+0

它只显示自己像2-3秒,然后消失多少网址,因为我把。此外,我只放入一个检索12mb数据的网址,并且在2-3秒内可以获取它,但它在2-3秒内再次消失。 – ozercevikaslan

+0

的问题是,它得到的范围内: Promise.resolve(urlCalls)。然后((RES)=> { 的console.log(RES); 解析(RES); loader.dismiss() }, (res)=> { reject(res); }) 当请求处于活动状态时,我的意思是它的挂起或检索数据。 它应该首先从调用中获取数据,然后进入Promise.resolve函数......我很困惑为什么它在http调用结束之前到达那里 – ozercevikaslan