我们如何在逐行运行的构造函数中创建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
答案 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");
})
});
}