2017-08-26 56 views
0

我是nodejs/angular2的新手。我對節點的異步行爲以及它返回到角度服務有一個奇怪的問題。我遇到的問題是兩個不同的角度組件,說組件A和組件B有相同的角度服務注入它們。node/angular2服務將值返回給錯誤的組件

服務器端是異步節點服務器,需要一些時間才能完成請求。問題是應用程序從角度組件A到角度組件B的路由,有時節點的請求從組件A完成,但由於我們是目前路由到組件B的響應去那裏。 (組件A和B同時不可見,每次只能看到一個)

因爲組件B也訂購了相同的服務/方法,所以它將得到爲組件A指定的返回結果。導致不正確的值。

有沒有辦法從組件B只接收對它發出的請求的響應。

兩者都是組件訂閱服務中相同的方法,例如:

的代碼的方式來大到放在這裏,所以我會怎麼做片段。

以下是每個組件中的代碼。

getNode(){ 

    this.userService.getNode().subscribe(resNodeData => { 
    this.node = resNodeData; 
      if(this.node == null){ 
      return null; 
     } 
     else{ 
    // console.log(this.node); 
      } 
     }); 

}

從服務層郵編:

export class UserService { 
    //call to node server async 
getNode() { 
return this.http.get("http://" + host + ":3000/api/namenode/" + this.clusterService.getCluster()) 
.map((res:Response) => res.json()) 
.catch(this._errorHandler); 
    } 


} 

我知道我的問題是長期和混亂。我將不勝感激任何幫助。

回答

1

您需要在兩個組件的生命週期鉤子OnDestroy中取消訂閱。

+0

否來自節點服務器的有效負載仍將傳遞到現在訂閱到服務層的組件。我試過這個,它不會工作。無論如何,我已經將其留在了代碼庫中。 – user1893410

+0

當然,我會看看我明天是否可以重新制作。與此同時,您使用的是什麼版本的Angular?您是否使用angular-cli創建項目,如果不是,那麼您使用的是什麼? – dockleryxk

+0

我正在使用角2.4.10。我也使用angular-cli 1.3.0。我認爲我需要做的是按照您的建議使用onDestroy方法,並使用像bluebird這樣的框架向節點服務器發送某種取消請求,以便它不會將有效內容發送到從此服務觀察的下一個組件。無論是那個還是我都需要打破抽象,只需使用兩個不同組件在服務層中調用的不同方法名稱即可。 (我討厭這樣做) – user1893410