Typescript 类中的Ionic2私有属性始终为空,即使在该类中进行了设置

Typescript 类中的Ionic2私有属性始终为空,即使在该类中进行了设置,typescript,ionic2,javascript-objects,Typescript,Ionic2,Javascript Objects,我是Ionic2和TypeScript的新手,尝试使用类、属性、getter和setter。 我的第一个类只是初始化webSQL数据库中的一些数据,并公开检索信息的方法,我想在其他类中使用这些方法: import { Injectable } from '@angular/core'; import * as PouchDB from 'pouchdb'; @Injectable() export class ezStockService { private _db;

我是Ionic2和TypeScript的新手,尝试使用类、属性、getter和setter。 我的第一个类只是初始化webSQL数据库中的一些数据,并公开检索信息的方法,我想在其他类中使用这些方法:

    import { Injectable } from '@angular/core';
import * as PouchDB from 'pouchdb';

@Injectable()
export class ezStockService {
    private _db;
    private _areas: any = [];
    private _ezstockzs;

    initDB(){
        this._db = new PouchDB('ezstockz', {adapter: 'websql'});

        var self = this;

        /**
        * Crée éventuellement les zones de stockage par défaut
        **/
        this._db.get("area_1").catch(function(error){
            if(error.name === 'not_found'){
                return {
                    _id: "area_1",
                    libelle:[
                        {
                            "lang": "FR-fr",
                            "value": "Nord"
                        },
                        {
                            "lang": "EN-en",
                            "value": "North"
                        }
                    ],
                    "logo": "images/boussole.png"
                }
            }
        }).then(function(gmDoc){
            self._db.put(gmDoc);
        });

        this._db.get("area_2").catch(function(error){
            if(error.name === 'not_found'){
                return {
                    _id: "area_2",
                    libelle:[
                        {
                            "lang": "FR-fr",
                            "value": "Sud"
                        },
                        {
                            "lang": "EN-en",
                            "value": "South"
                        }
                    ],
                    "logo": "images/boussole.png"
                }
            }
        }).then(function(fgDoc){
            self._db.put(fgDoc);
        });

        this._db.get("area_3").catch(function(error){
            if(error.name === 'not_found'){
                return {
                    _id: "area_3",
                    libelle:[
                        {
                            "lang": "FR-fr",
                            "value": "Est"
                        },
                        {
                            "lang": "EN-en",
                            "value": "East"
                        }
                    ],
                    "logo": "images/boussole.png"
                }
            }
        }).then(function(cgDoc){
            self._db.put(cgDoc);
        });
    }

    /**
    * Method that retrieve all areas
    **/
    allAreas() {
         this._db = new PouchDB('ezstockz', {adapter: 'websql'});
         this._areas = [];

         var self = this;

         this._db.allDocs({
            startkey: 'area_',
            endkey: 'area_\uffff',
            include_docs: true
         }).then(function(areas){
            var rows = areas.rows;
            var zones = [];
            rows.forEach((item,index) => {
                var area = {
                    "libelle": item.doc.libelle[0].value,
                    "image": item.doc.logo
                };
                zones.push(area);
            });
            return zones;
         }).then(function(areas){
            self._areas = areas;
         });
    }

    /**
    * Method that get areas
    **/
    get areas(){
        return this._areas;
    }
    }
在我的应用程序的其他地方,我想列出视图中的所有区域,因此,在另一个类中,尝试使用areas getter,如下所示:

import { Component } from '@angular/core';

import { NavController, Platform } from 'ionic-angular';

import { ezStockService } from '../../services/ez-stock.service';

@Component({
  selector: 'page-stocks',
  templateUrl: 'stocks.html'
})
export class Stocks {
    public stocks = [];
    items: any;

  constructor(public navCtrl: NavController,
   private platform: Platform,
   private stockService: ezStockService ) {
    this.items = [];

    var self = this;

    stockService.allAreas(); // Invoke method

    var areas = stockService.areas; // Invoke getter


    console.log("Zones : (" + areas.length + ")");
  }
}
即使allAreas()方法返回数组中的3项,console.log的结果始终为“0”

不知道为什么会出现这种行为,不了解TypeScript中的属性范围

Thx 4您的帮助…

在线

stockService.allAreas(); // Invoke method
你应该

stockService.allAreas().then(function(){
  var areas = stockService.areas; // Invoke getter
  console.log("Zones : (" + areas.length + ")");    
}); // Invoke method

这是因为这是一个不同步的呼叫。这是一个承诺,完成后必须解决。

Thx。。。这是否意味着必须在调用的方法中编写一个defered.resolve()。@Jean LucAubert是的,您可以