我在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);
}
但我更喜欢让我的函数返回一个对象。我做错了什么?
答案 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)
就是这样。
解决您的意见的附录:
您必须了解有关异步操作和承诺的两个概念:
承诺在不同的线程中执行,因此调用getService()
之后的行在数据到达之前执行。这就是为什么console.log()
在那时没有显示数据的原因。这也是为什么尝试返回结果不起作用的原因
代码中唯一可以捕获承诺结果的地方是.then()。在那里,您可以对结果执行任何操作,包括将其存储在任何变量中。请记住上面的第1点,并且不要期望在下一行上访问结果,因为then()
会在不同的线程上及时发生。
分配来自该服务的json(返回一个 承诺),我在上面的行中定义的内部变量,它 不管用。如何将它存储到内部变量并将其返回
你不能。