2017-04-11 78 views
0

我是Ionic2的新手,我不太了解异步编程是如何工作的。Ionic2从Http请求中返回一个值并将其分配给变量

我希望函数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

回答

1

您可以简单地从checkLogin()返回可观察值并在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); 
    }); 
} 

注意:这是随后这些登录信息,所有的操作,会在this.globalVar.checkLogin().subscribe()。如果您尝试访问this.isLoggedIn以外的任何地方,它可能会或可能无法访问。这是一个异步操作。你需要等待它解决。其他不依赖于这个变量的操作可以在这个函数之外进行。

UPDATE 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); 
    }); 
    }); 
} 

回家。ts:

ionViewWillEnter() { 
    this.globalVar.checkLogin() 
    .subscribe(data => { 
    this.isLoggedIn = data; 
    console.log(this.isLoggedIn); 
    },(err) => { 
    console.log("Error occurred:",err); 
    }); 
} 
+0

谢谢你的建议。我想返回简单值的原因是我有'checkLogin()'每个选项卡,所以我不想每次重复订阅部分。有什么办法可以返回简单的值,如0或1? – smchae

+0

嘿。为此我尝试了一些东西。在最大值时,您可以将'isLoggedIn'的逻辑转换为通用的'checkLogin()'方法。但是,'.subscribe()'将不会有任何替代方法从一个调用方法将更新我的答案。 –

+0

更新了我的答案。另外,由于这是异步的,我认为这就是你将不得不等待事件完成的原因。 –

0

您在供应商已认购。 subscribe函数只是返回一个订阅而不是值。您应该返回组件中的observable并订阅。

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'; 
+0

更新的答案..只需导入提供程序'导入'rxjs/add/operator/do';' –

+0

谢谢!有用。但'val'返回http请求的响应结果,而不是我期望的0或1。 – smchae

+0

哦好吧.. https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/do.md它似乎主要用于记录..将更新答案..多它在'地图'本身 –

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

我希望它为你工作。

相关问题