从Javascript承诺返回数据

问题描述:

这是在角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只是一堆承诺相关的东西,而不是用户数组。

说明:你已经在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

的承诺立即返回,所以这是不行的。

成功和错误事件需要在模型级别进行处理,以便您可以对数据(而不是服务的责任)进行所需的操作。该服务只是获取数据并将其发送到回调函数。

事情是这样的:

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

    }