2016-09-27 77 views
1

我试图解决从我的服务到我的控制器的承诺。

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()位于我的控制器的构造函数内。

无论其一些奇怪的原因(也许是时机?),我可以解决的承诺,如果我这样做我的控制器内:

Controller.ts

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

基本上等待第二次在做承诺“设置”之前。更奇怪的是,当我用我的控制器加载页面时,它首先加载承诺设置,然后加载服务。所以这不是因为一个在另一个之前加载。

我解决了我的诺言错了吗?

编辑:我忘记说了,我能看到的承诺正在得到解决(至少它击中then(),但then()里面的东西永远不会被最初烧制改变状态,它会调用无论是内部

+0

您可以添加jsfiddle或plunker,因为从单行代码很难在大脑中编译它。 – Mikki

+0

@Mikki我很想为你创建一个演示,但是不幸的是我使用了一个Angular包装器来处理SignalR,并且我确信它不会在Plunker中运行:(我只是在想'this.SetupPromise = this。$ q.resolve();'是解决承诺的最好方法,或者像'this.SetupPromise.resolve();'这样的东西可以工作,所以当前的承诺得到解决,而不是用整个承诺替换一个解决的问题 – MortenMoulder

回答

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

不错的一个,你在''Promise resolved'结尾忘了双引号' – Mikki

+0

@Mikki哎呀哈哈,这只是我为这个问题编写的代码示例 – MortenMoulder

1

你在这里做什么 - 你在这条线上重写你的承诺this.SetupPromise = this.$q.resolve();。我会给你打字稿模式使用推迟对象:

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"); 
}); 

在这样的模式,要导出只答应财产,并保持你的推迟对象为私人。

+0

是的,这就是我最终做的。 – MortenMoulder