在函数angular2

时间:2016-10-28 05:52:47

标签: json function angular

我在Angular2中有以下服务:

@Injectable()
export class MyService{

    private myServiceUrl= ....

    constructor(private http: Http) { }

    getService(): Promise<MyObject> {
        return this.http.get(this.myServiceUrl).map(response => response.json())
            .toPromise();
    }    
}

我在我的一个组件中有这个功能:

myFunction(): any{
    let toReturn: any;
    this.myService.getService().then(result => toReturn = result);
    console.log(toReturn);
    return toReturn;
  }

基本上,正如您所看到的,我想存储在toReturn中,它是myService的承诺返回的对象。我正在寻找我的剩余电话,我正在获得正确的json,但是当我试图将它存储在内部变量中时,我在toReturn中得不到确定。

但是,如果我试试这个:

this.myService.getService().then(result=> console.log(result));

我能够看到我想要的json。

我可以做这样的功能:

getService(address: string) {
        this.myService.getService().then(result=> this.result= result);
}

但我更喜欢让我的函数返回一个对象。我做错了什么?

1 个答案:

答案 0 :(得分:2)

请记住getService是异步的,所以当你的代码到达

行时
return toReturn;

toReturn变量尚未收到来自服务器的数据。

最简单的处理方法是返回promise本身,以便调用代码在从服务器到达时提取数据:

myFunction(): Promise<MyObject> 
{
    //return the promise that will output data in the future
    return this.myService.getService();
}

调用代码可以这种方式访问​​数据:

myFunction().then( result =>
    this.result= result
)

你甚至可以通过删除myFunction删除一个步骤,因为它只是getService()周围的一个薄包装。相反,调用代码可以简单地执行:

this.myService.getService().then(result => this.result = result)

就是这样。

解决您的意见的附录

您必须了解有关异步操作和承诺的两个概念:

  1. 承诺在不同的线程中执行,因此调用getService()之后的行在数据到达之前执行。这就是为什么console.log()在那时没有显示数据的原因。这也是为什么尝试返回结果不起作用的原因

  2. 代码中唯一可以捕获承诺结果的地方是.then()。在那里,您可以对结果执行任何操作,包括将其存储在任何变量中。请记住上面的第1点,并且不要期望在下一行上访问结果,因为then()会在不同的线程上及时发生。

  3.   

    分配来自该服务的json(返回一个   承诺),我在上面的行中定义的内部变量,它   不管用。如何将它存储到内部变量并将其返回

    你不能。