2016-11-30 83 views
0

由於某些原因,我的listImage()方法返回null我不知道我可能做錯了什麼。由於某些原因,我的listImage()方法返回null方法返回null

import { 
    Injectable, 
} 
from '@angular/core' 
declare 
var firebase; 

@ 
Injectable() 
export class StorageService { 

    img:any; 

    listImage() { 

    var getImages = firebase.database().ref('flats').once('value'); 
    getImages.then(snapshot => { 
     var imgName = snapshot.val(); 
     var names; 

     snapshot.forEach(imgName => { 
     names = imgName.val(); 
     let i = names.image; 
     //console.log(i); 
     let key = imgName.key 
     firebase.storage().ref(i + '.jpg').getDownloadURL().then(url => { 
      this.img = url; 
     }); 
     }) 
    }) 
    return this.img; 
    } 

} 

難道是forEach()限制它

constructor(public navCtrl: NavController, service: StorageService) { 
    this.service = service; 
    var img = this.service.listImage(); 
    console.log(img); //this returns null what could be the issue? 
} 
+0

這是異步的方法。這個問題有很多問題。我的事情是非angular2問題 – yurzui

+0

哦,我看到是不是有角度的方法或庫可以解決這個問題。 –

回答

1

的問題是,JS是異步的。它與Angular 2本身無關。

當您撥打listenImage()函數時,您正在使用承諾,這是處理此問題的正確方法。 不過看你返回命令: return this.img;

它不承諾內部處理,因爲它不是內部的任何.then() 所以你基本上是打電話給你getImages()承諾,並跳轉到返回指令,而無需等待任何結果。

除此之外,您正在異步調用foreach中異步調用。

Here是一個很好的答案,它描述了在異步任務期間如何正確使用promise。 你也應該看看this,看看你如何處理foreach和其他循環時使用承諾(這是在新手誤區#2)。

+0

是的,閱讀'$ q'文檔https://docs.angularjs.org/api/ng/service/$q – jediz