Ionic2从Http请求返回一个值并将其赋值给变量

时间:2017-04-11 05:24:39

标签: angular ionic2

我是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);
}

结果    enter image description here

3 个答案:

答案 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)
      })
    })
}

我希望它为你工作。