Ionic 3在构造函数中做出了承诺功能

时间:2017-11-17 07:38:33

标签: angular firebase firebase-realtime-database ionic3 angularfire2

我们如何在逐行运行的构造函数中创建promise函数并等待它的结果然后转到下一行。目前我的promise函数没有运行,它最后运行。

constructor(){
    console.log("Start");
    this.getData();
    console.log("End");
}

getData() {
   return new Promise(data => {
     this.db.database.ref().child('/category').orderByChild('parent_id').
       equalTo(this.idn).once('value').then(function (snapshot) {
         console.log("Mid")
       })
   });
}

上面的输出是

Start
End
Mid

预期输出

Start
Mid
End

3 个答案:

答案 0 :(得分:4)

只是为了澄清,你的承诺功能最后没有运行。它按照预期在“开始”之后和“结束”之前开始。它恰好完成最后一次。这是因为它是设计上的“异步”调用。 (Async ==非阻塞意味着程序不会等待它完成。它只是转到下一个语句,console.log(“End”),在你的例子中。)

顺便说一句,在Ctor中调用像“getData()”这样的方法并不是一个好习惯。您可能希望在像ngOnInit()这样的Angular生命周期方法中执行此操作。

答案 1 :(得分:2)

由于getData函数返回一个promise,解析它并将控制台置于其中

constructor(){
    console.log("Start");
    this.getData().then(function (snapshot) {             
        console.log("End");
    })
}

答案 2 :(得分:1)

在Constructor中调用getData()方法并不是一个好习惯。损害应用程序性能。我建议使用ionViewDidLoad代替离子,这几乎是所有情况下你都需要的。

ionViewDidLoad(){
    console.log("Start");
    this.getData();
}

getData() {
   return new Promise(data => {
     this.db.database.ref().child('/category').orderByChild('parent_id').
       equalTo(this.idn).once('value').then(function (snapshot) {
         console.log("Mid"),
         //put the code you want to execute after Mid here
         console.log("End");

       })
   });
}