2017-07-24 45 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