2016-10-28 120 views
-1

我在Angular2以下服务:在函数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; 
    } 

基本上,作为你可以看到,我想存储到返回,由myService的承诺返回的对象。我正在寻找其他人打来的电话,并且我正在获得正确的json,但是当我试图将其存储在内部变量中时,我将无法进入返回。

不过,如果我试试这个:

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

我能看到我想要的JSON。

我可以做这样的函数:

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

但我宁愿让我的函数返回一个对象。我究竟做错了什么?

回答

2

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

return toReturn; 

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

对付这种最彻底的方法是返回的承诺本身,这样,当它从服务器到达时调用的代码将提取的数据:

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) 

就是这样。

附录,以解决您的意见

你必须了解有关异步OPS和承诺两个概念:

  1. 允诺在不同的线程执行,所以以后的行在之前执行getService()执行数据到达。这就是为什么console.log()在这一点上不会显示数据的原因。这也是为什么试图返回没有工作的结果

  2. 在代码中您可以捕获承诺结果的唯一地方是.then()。在那里你可以做任何你想要的结果,包括将它存储在任何变量中。请记住上面的第1点,并且不要期望能够访问下一行中的结果,因为then()会在其他线程上稍后发生。

分配一个来自于服务(返回 诺)的JSON,与我在线路上述定义的内部变量,它 不工作。如何将它存储到一个内部变量并返回它

你不能。

+0

AFAIR地理编码API也未被zone.js覆盖,并且需要'zone.run(...)'函数中的代码在Angulars区域内运行。 –

+0

诺言是由googleMapGeocodingService返回的,所以我没有接受Promise。 – Manuelarte

+0

伙计们,忘了地理编码,让我们把另一个名字给服务,服务正在工作......它不工作的是分配给一个内部变量。如果我做了geocoding => console.log(地理编码),我可以看到完整的JSON。 – Manuelarte

相关问题