2016-09-27 62 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