我对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,尤其是因为您似乎只需要调用一次即可。

09-25 17:42