Json 为函数angular2中的内部变量赋值

Json 为函数angular2中的内部变量赋值,json,function,angular,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.j

我在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();
    }    
}
基本上,正如您所看到的,我想在toReturn中存储myService承诺返回的对象。我正在寻找我的rest调用,我得到了正确的json,但是当我试图将其存储在内部变量中时,我又得到了未定义的json

但是,如果我尝试这样做:

this.myService.getService().then(result=> console.log(result));
我能够看到我想要的json

我可以执行如下功能:

getService(address: string) {
        this.myService.getService().then(result=> this.result= result);
}
但是我更喜欢让我的函数返回一个对象。我做错了什么?

记住getService是异步的,所以当代码到达行时

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

处理此问题的最干净的方法是返回承诺本身,以便调用代码在数据从服务器到达时提取数据:

myFunction(): Promise<MyObject> 
{
    //return the promise that will output data in the future
    return this.myService.getService();
}
您甚至可以通过去掉myFunction来删除一个步骤,因为它只是getService的一个薄包装。相反,调用代码可以简单地执行以下操作:

this.myService.getService().then(result => this.result = result)
就这样

针对您的意见的附录:

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

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

代码中唯一可以捕获承诺结果的地方是。在那里,您可以对结果执行任何操作,包括将其存储在任何变量中。只需记住上面的第1点,不要期望在下一行访问结果,因为这会在稍后的时间发生在另一个线程上

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


您不能。

AFAIR地理编码API也不在zone.js中,需要一个zone.run。。。函数中的代码在Angulars zone内运行。该承诺由googleMapGeocodingService返回,因此我没有遵守该承诺。在调用getGeocoding时无法存储它,因为该函数是异步的。我给了你2个工作选项:1:返回你从服务中得到的承诺,我向你展示了如何提取其数据,2:在数据到达时执行回调。您将无法在尝试返回结果时立即返回结果,因为当JS引擎到达您的返回行时,结果尚未到达。@Manuelarte我向您演示了如何使用数据。我已更新了我的答案以匹配您编辑的问题。基本上,您可以调用。然后调用myFunction的返回值。然后,数据到达了内部。再看看我的答案;特别是说:调用代码可以通过这种方式访问数据。PS:我已经编辑了我的答案的结尾,以简化一些事情。@Manuelarte老实说,我不知道还有什么可以帮助的;也许除了我或冈瑟以外的人能更好地解释。我在回答的底部加了一点,作为最后一次解释为什么你不能按自己的方式做自己想做的事。如果你否决了我的答案,我仍然想知道为什么。
myFunction().then( result =>
    this.result= result
)
this.myService.getService().then(result => this.result = result)