2015-10-24 419 views
0

早上好!TypeScript异步/等待

我有以下Angular/TypeScript服务,但函数的查询部分是异步发生的,所以在从服务器检索数据之前执行return语句。有没有办法给这个函数添加async/await,以便在执行return语句之前等待将数据分配给Users变量?

interface IUserService { 
     getAll(): entities.IUser[]; 
    } 

    export class UserService implements IUserService { 
     static $inject: string[] = ['dataAccessService']; 
     constructor(private dataAccessService: dataAccess.DataAccessService<entities.IUser>) { 

     } 

     getAll(): app.domain.entities.IUser[] { 
      var users: app.domain.entities.IUser[]; 
      var userResource = this.dataAccessService.getDataResource('https://api.github.com/users'); 
      userResource.query((data: app.domain.entities.IUser[]) => { 
       users = data; 
      }); 

      return users; 
     } 
    } 

    angular 
     .module('domain') 
     .service('userService', 
        UserService); 
+0

你见过这个吗?:http://stackoverflow.com/questions/32401741/async-await-simple-example-typescript – mentat

+0

有趣......谢谢!如果我正在使用模块,我如何让它们将该异步关键字嵌套到命名空间的每个IFFE层。我可能需要找到解决方法,直到TypeScript 2.0。 – BSmith

回答

0

使用$ resource,您可以直接将资源值直接设置为变量,而不是在回调方法中设置变量。

interface IUserService { 
    getAll(): ng.resource.IResourceArray<ng.resource.IResource<IUser>>; 
} 

export class UserService implements IUserService { 
    static $inject: string[] = ['dataAccessService']; 
    constructor(private dataAccessService: dataAccess.DataAccessService<entities.IUser>) { 
     var userResource = this.dataAccessService.getDataResource('https://api.github.com/users'); 
    } 

    getAll(): ng.resource.IResourceArray<ng.resource.IResource<IUser>> { 
     return userResource.query(); 
    } 
} 

angular 
    .module('domain') 
    .service('userService', 
       UserService); 

然后在我的控制器I可以直接设置的值,以我的变量在我的视图来呈现。

class UserController { 
    user: ng.resource.IResourceArray<ng.resource.IResource<IUser>>; 

    static $inject: string[] = ['UserService']; 
    contructor(private userService: IUserService) { 

    } 

    this.users = this.userService.GetAll(); 
} 

angular.module('app').controller('UserController', UserController); 

这将让我进入我的用户属性以及像原来承诺的一些附加属性,所以我可以添加额外的功能,如果我想。

希望能帮助任何有类似问题的人。