我是Ionic2的新手,我不太了解异步编程是如何工作的。
我希望函数checkLogin()
返回值0或1,但是,它返回下面的结果。如何为变量this.isLoggedIn
分配我想要的值?
任何建议或建议都将不胜感激。
提前谢谢。
提供商
checkLogin() {
var url = this.app.URL + 'api/program/information';
var isLoggedIn;
return this.http.get(url).map(res =>res.json()).subscribe( logininfo =>{
if (!logininfo.data.information.is_logged_in) {
isLoggedIn = 0;
} else {
isLoggedIn = 1;
}
return isLoggedIn;
})
}
home.ts
ionViewWillEnter() {
this.isLoggedIn = this.globalVar.checkLogin();
console.log(this.isLoggedIn);
}
答案 0 :(得分:1)
您只需从checkLogin()
返回一个observable,然后在home.ts
订阅即可。像这样:
checkLogin() {
var url = this.app.URL + 'api/program/information';
return this.http.get(url);
}
home.ts:
ionViewWillEnter() {
this.globalVar.checkLogin()
.map(res => res.json())
.subscribe(logininfo => {
if (!logininfo.data.information.is_logged_in) {
this.isLoggedIn = 0;
}
else {
this.isLoggedIn = 1;
}
console.log(this.isLoggedIn);
},(err) => {
console.log("Error occurred:",err);
});
}
注意:此登录信息后面的所有操作都将放在.subscribe()
的{{1}}中。如果您尝试访问除此之外的其他任何位置的this.globalVar.checkLogin()
,则可能会或可能无法访问该this.isLoggedIn
。这就是异步操作。你需要等待它得到解决。其他不依赖于此变量的操作可以在此函数之外进行。
更新1:将if()
部分转换为常用方法:
checkLogin() {
var url = this.app.URL + 'api/program/information';
return Observable.create(observer => {
this.http.get(url)
.map(res => res.json())
.subscribe(logininfo => {
var isLoggedIn;
if(!logininfo.data.information.is_logged_in) {
isLoggedIn = 0;
}
else {
isLoggedIn = 1;
}
observer.next(isLoggedIn);
},(err) => {
console.log("Error occurred:",err);
observer.error(err);
});
});
}
home.ts:
ionViewWillEnter() {
this.globalVar.checkLogin()
.subscribe(data => {
this.isLoggedIn = data;
console.log(this.isLoggedIn);
},(err) => {
console.log("Error occurred:",err);
});
}
答案 1 :(得分:0)
您已在提供商中订阅。 subscribe
函数只返回订阅而不是值。您应该返回组件中的observable和subscribe。
checkLogin() {
var url = this.app.URL + 'api/program/information';
var isLoggedIn;
return this.http.get(url).map(res =>{
let logininfo = res.json();
if (!logininfo.data.information.is_logged_in) {
isLoggedIn = 0;
} else {
isLoggedIn = 1;
}
return isLoggedIn;
})
}
在您的组件中,
ionViewWillEnter() {
this.globalVar.checkLogin().subscribe(val=>{
this.isLoggedIn=val;
console.log(this.isLoggedIn);
})
}
要使用do()
或任何其他rxjs
函数,您需要明确导入它们。
import 'rxjs/add/operator/do';
答案 2 :(得分:0)
你可以使用promise函数进行异步操作。
checkLogin() {
var url = this.app.URL + 'api/program/information';
return new Promise((resolve, reject) => {
this.http.get(url).map(res =>res.json()).subscribe( logininfo =>{
if (!logininfo.data.information.is_logged_in) {
resolve(0)
} else {
resolve(1)
}
},err=>{
reject(err)
})
})
}
我希望它为你工作。