2017-07-26 71 views
0

我试图从firebase中获取两个对象并在显示之前操作数据。 不幸的是,我只得到其中一个对象,但我不知道为什么。FirebaseObjectObservable不能及时返回对象

以下是代码片段:

page.ts

let item: ItemModel = this.ItemProvider.getItem(itemID); 
let itemInfo: ItemInfoModel = this.ItemProvider.getItemInfo(itemID); 

provider.ts

item: ItemModel = new ItemModel(); 
itemInfo: ItemInfoModel = new ItemInfoModel(); 

    getItem(itemID: string): ItemModel { 
    var subscription = this.db.object(`/items/${itemID}`, { preserveSnapshot: true }) 
     .subscribe(item => { 
     let i: ItemModel = item.val(); 
     this.item = i; 
    }); 
    subscription.unsubscribe(); 
    return this.item; 
    } 

    getItemInfo(itemID: string): ItemInfoModel { 
    var subscription = this.db.object(`/itemInfo/${itemID}`, { preserveSnapshot: true }) 
     .subscribe(itemInfo => { 
     let i: ItemInfoModel = itemInfo.val(); 
     this.itemInfo = i; 
    }); 
    subscription.unsubscribe(); 
    return this.itemInfo; 
    } 

正如你可以看到这两个功能是相似的,但仍然是getItemInfo不及时返回值。

当我做CONSOLE.LOG在打印page.ts以下

console.log(item); => Object { data... } 
console.log(itemInfo); => ItemInfoModel { } 

我试图切换的功能的调用和先得到itemInfo,但它不会有任何效果。

我火力的结构是这样的:

- firebase 
    - items 
     -KIedkI3983ndK 
      -name 
      -img 
      -price 
      -actualInfo => KIe3jkdl83dsf 
    - itemInfo 
     -KIeDjeidl3njd 
      -item => KIedkI3983ndK 
      -info1 
      -info2 
     -KIe3jkdl83dsf 
      -item => KIedkI3983ndK 
      -info1 
      -info2 

因为我仍然很新的这一点,我什么都试过了我在这里读计算器,但没有找到解决问题的办法。

在getItemInfo的订阅中,我确实有正确的值,但它在调用return语句之前并未写入全局this.itemInfo中。 它在getItem中的连线完全相同的代码工作。

任何想法?

回答

0

您需要在FirebaseListObservable选项中添加查询对象。你的'getItemInfo'功能应该是这样的:

getItemInfo(itemID: string): ItemInfoModel { 

var subscription = this.db.list('/itemInfo/', { query: { orderByChild: 'item', equalTo: itemID }}) 
.subscribe(itemInfo => { 
     let i: ItemInfoModel = itemInfo.val(); 
     this.itemInfo = i; 
    }); 
    subscription.unsubscribe(); 
    return this.itemInfo; 
}