2017-01-04 90 views
2

初始化數據具有一些特性,這對任何組分負載之前被初始化服務(它們用作參數,以其他HTTP調用)。用於調用以下方法的路由CanActivate方法,該方法應在屬性初始化後檢索true,或在錯誤時檢索爲false。我收到編譯錯誤:聲明類型既不是「無效」也不是「任何」的函數必須返回一個值。我怎樣才能避免這個錯誤?如何在角2

public setupSession(): boolean { 

    this._http.get('myservice_url') 
    .map (
     (response: Response) => <any>response.json()) 
     .subscribe (
     data => { 
      this.property1 = data.property1; 
      this.property2 = data.property2; 
      return true; 
     }, 
     err => { 
      console.error(err) 
      return false; 
     } 
    ) 
} 

編輯: @K。 Daniek感謝您的幫助!我在這篇文章的幫助下找到了解決方案link。現在我可以確保設置完成之前任何其他http調用。

的服務方法:

public setupSession(): Promise<any> { 
    var observable = this._http.get('myservice_url') 
     .map((response: Response) => { 
      var res = response.json(); 
      return res; 
     }); 

    observable.subscribe(data => { 
     this.property1 = data.property1; 
     this.property2 = data.property2; 
    }); 

    return observable.toPromise(); 
} 

canActivate方法:

canActivate() { 
    return this._sessionService.setupSession().then(() => { 
     return true; 
    }); 
} 

回答

0

我沒有看到聲明此功能布爾類型,尤其是當這個函數的返回實際上是點數據,而不是布爾值。

嘗試下面的代碼:

public setupSession() { 

    this._http.get('myservice_url') 
    .map(
    (response: Response) => <any>response.json()) 
    .subscribe(
    data => { 
     this.property1 = data.property1; 
     this.property2 = data.property2; 
    }, 
    err => { 
     console.error(err); 
    } 
    ) 
} 

編輯:我是測試你的代碼一點點,只是意識到,實際上有可能使這種功能的工作,但你必須基本上返回一個布爾值經過subscribe方法。重構後的代碼如下所示:

public setupSession(): boolean { 

    this._http.get('myservice_url') 
     .map(
      (response: Response) => <any>response.json()) 
     .subscribe(
      data => { 
       this.property1 = data.property1; 
       this.property2 = data.property2; 
      }, 
      err => { 
       console.error(err); 
      }); 
    return true; 

} 

現在,您的http請求函數返回一個布爾值,編譯器不會拋出任何錯誤。

EDIT2

聽着,如果你想要這個功能是boolean類型,你必須調用該函數後返回一個boolean值。由於這個調用是異步的,因此該函數繼續執行其他任務,並且不會等待異步響應。這就是爲什麼函數總是返回連或success響應error返回前true(在這種特殊情況下)。

如果你想要的功能,以成功或false的情況下錯誤的,使用的情況下返回true下面的代碼:

public setupSession() { 

    this.http.get(`myservice_url`) 
     .map(data => data.json()) 
     .subscribe(data => { 
       this.property1 = data.property1; 
       this.property2 = data.property2; 
       console.log('works'); 
       return true; 
      }, 
      err => { 
       console.error(err); 
       console.log('error); 
       return false; 
      }); 
} 
+0

在這種情況下,我怎麼能檢索canActivate價值?如果我不使用canActivate,那麼在我將它們用作其他http調用的參數之前,屬性將不會被初始化。 – Victor

+0

在第二種情況下,您會在收到實際數據之前檢索布爾值。 – Victor

+0

@Victor檢查我編輯過的帖子。 –