我正在尝试解决从我的服务到我的控制器的承诺。
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()
内的东西最初从未被解雇。改变状态,它将会打电话给内心。
答案 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对象保密。