2017-04-11 129 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) 
     }) 
    }) 
} 

我希望它爲你工作。

相關問題