2017-10-05 132 views
0

這是在角2和打字稿中完成的。從Javascript承諾返回數據

我想從服務器返回數據並將其傳回給角度的組件。

getUsers(): Promise<User[]> { 
    return this.http.get(this.baseUserUrl + 'GetUsers') 
     .toPromise() 
     //.then(resp => resp.json() as User[]) 
     .then(this.returnData) 
     .catch(this.handleError); 
} 


private handleError(error: any): Promise<any> { 
    console.error('An error occurred', error); // for demo purposes only 
    return Promise.reject(error.message || error); 
} 

private returnData(data: any): User[] { 
    var rtn = data.json() as User[]; 
    return rtn; 
} 

數據從服務器罰款並返回到用戶[]罰款也罰款。

但是,它沒有返回到JavaScript方法。

ngOnInit(): void { 
     this.userService.getUsers().then(users => this.users = users); 

    } 

我this.users只是一堆承諾相關的東西,而不是用戶數組。

回答

0

說明:你已經在getUsers調用。那麼(),所以調用它兩次西港島線不是有它的有關鏈接一個承諾,讓你的代碼,你可以設置returnData的承諾得的數據,並能像你這樣的IT連鎖做。

private returnData(data: any): Promise<User[]> { 
    var rtn = data.json() as User[]; 
    return Promise.resolve(rtn); 
} 

現在你可以使用:

this.userService.getUsers().then(users => this.users = users); 

,但使用可觀察到的地圖運營商的S implest方式:

getUsers(): Promise<User[]> { 
    return this.http.get(this.baseUserUrl + 'GetUsers') 
     .map(users => this.returnData(users)) 
     .toPromise() 
} 

和ngOnInit:

ngOnInit(): void { 
    this.userService.getUsers().then(users => { 
     this.users = users 
    }); 

} 

或者只是觀察到:

getUsers(): Observable<User[]> { 
    return this.http.get(this.baseUserUrl + 'GetUsers') 
     .map(users => this.returnData(users)) 
} 

ngOnInit(): void { 
    this.userService.getUsers().subscribe(users => { 
     this.users = users 
    }); 
+0

這可以很容易地觀測量也可以解決。我猜OP在獲得數據後沒有調用這個決心。 – Niladri

0

的承諾立即返回,所以這是不行的。

成功和錯誤事件需要在模型級別進行處理,以便您可以對數據(而不是服務的責任)進行所需的操作。該服務只是獲取數據並將其發送到回調函數。

事情是這樣的:

loadUsers(successCallback, errorCallback): Promise<User[]> { 
    return this.http.get(this.baseUserUrl + 'GetUsers') 
     .toPromise() 
     .then(successCallback) 
     .catch(errorCallback); 
} 

// MOVE METHODS TO MODEL CODE 
var self = this; 
self.users = []; 

private handleError(error: any): Promise<any> { 
    console.error('An error occurred', error); // for demo purposes only 
    return Promise.reject(error.message || error); 
} 

private loadData(data: any): User[] { 
    self.users = data.json() as User[]; 
} 

ngOnInit(): void { 
     this.userService.loadUsers(loadData, handleError); 

    }