我对Typescript / JavaScript很陌生。所以这可能是一个菜鸟问题:
我有一个Typescript类,可以称之为serviceActions
。
在该类的constructor
中,我通过BreezeJS连接到Web API服务。我还获得了服务的元数据(fetchMetadata
)。
但是,fetchMetadata
调用返回一个promise。因此constructor
在完成之前会返回。
现在,这个serviceActions
类被注入(通过Aurelia)到另一个类中:
@autoinject
export class BoxVm {
constructor(serviceActions: serviceActions) {
this.box = this.serviceActions.createNewBox();
}
所以我从来没有真正等待过。因此,当调用
createNewBox
时,fetchMetadata
调用不会完成,并且调用会出错。现在我可以在我的
initialize
类上放入一个ServiceActions
方法。但是然后我必须将我所做的一切都包装在BoxVM中,以实现这一目标。所有获取数据,保存数据创建任何实体的调用都必须在对initalize.then
的调用中完成。还有另一种方法吗?我错过了重点吗?还是用Typescript / JavaScript完成的方式?
最佳答案
问题是ServiceActions
在等待一个诺言可以使用之前正在等待兑现。有几种解决方案:
等待ES7,这使我们await
一个承诺的结果。您的createNewBox
函数将耐心等待诺言完成,然后再返回。这是最干净的解决方案。
找出将fetchMetadata
结果传递给构造函数的方法(可能在运行DI框架初始化之前进行调用)。这避免了该问题。
使用initialize().then
进行建议的操作,尽管它似乎容易出错(有人可能会忘记将代码包装在init中)。
在onInit
中创建一个带有回调的ServiceActions
函数-这是您所建议内容的轻度重构版本。createNewBox
等待Box
诺言完成后,让ServiceActions
返回诺言以交出新的fetchMetadata
。这可能会污染许多承诺的一切。
我会尝试选项2,尤其是因为您似乎只需要调用一次即可。