$ q承诺不会在加载时解析,但更改状态会解析它

时间:2016-09-27 07:12:54

标签: angularjs typescript

我正在尝试解决从我的服务到我的控制器的承诺。

Service.ts

public SetupPromise: angular.IPromise<any> = this.$q.defer().promise;

Controller.ts

//include my Service in my Controller
private Service: Service

this.Service.SetupPromise.then(() => {
    console.log("Promise resolved");
});

为了解决我的承诺,我使用这样做:

Service.ts

this.SetupPromise = this.$q.resolve();

执行此操作时,它应解决控制器内的承诺。它工作正常,它确实解决了它,但只有当我改变状态并回到控制器。整个SetupPromise.then()位于我的控制器的构造函数中。

HOWEVER 出于一些奇怪的原因(也许是计时?),我可以解决这个承诺,如果我在我的控制器内执行此操作:

Controller.ts

setTimeout(() => {
    this.Service.SetupPromise.then(() => {
        console.log("Promise resolved);
    });
}, 1000);

在做承诺之前基本等待一秒钟&#34;设置&#34;。更奇怪的是,当我用控制器加载页面时,它首先加载承诺设置,然后加载服务。所以不是因为一个人在另一个人之前加载。

我是否错误地解决了我的承诺?

编辑:我忘了说,我可以看到承诺得到解决(至少它会击中then(),但then()内的东西最初从未被解雇。改变状态,它将会打电话给内心。

2 个答案:

答案 0 :(得分:1)

上帝该死的,我修好了..我想知道为什么这不能正常工作,所以我尝试了一些不同的东西(很少就像......所有这些)。我最终这样做了:

Service.ts **

public SetupPromise: angular.IDeferred<any> = this.$q.defer();

基本上一开始就把它推迟,但不是把它作为一个承诺,而是一个“延期承诺”(就是这样)?在那之后,我可以像这样解决它:

<强> Service.ts

this.SetupPromise.resolve();

然后在我的控制器中我会这样做:

<强> Controller.ts

this.Service.SetupPromise.promise.then(() => {
    console.log("Promise resolved");
});

现在它起作用..那个奇怪的人。显然,我必须解决这个承诺,而不是用一个已经解决的承诺取代它。

答案 1 :(得分:1)

你在这里做什么 - 你在这一行this.SetupPromise = this.$q.resolve();重写你的承诺。我将为您提供使用延迟对象的TypeScript模式:

<强> Service.ts

public promise: ng.IPromise<any>;
private defer: ng.IDeferred<any>;

constructor(
    private $q: ng.IQService
) {
    this.defer = this.$q.defer();
    this.promise = this.defer.promise;
    this.defer.resolve();
}

<强> Controller.ts

this.Service.promise.then(() => {
    console.log("Promise resolved");
});

在这种模式中,您只导出promise属性,并将defer对象保密。