2016-10-03 91 views
1

我是javascript新手,我需要一些幫助來了解如何使用承諾(使用藍鳥)。下面是我的代碼,我希望構造函數在屬性解析後初始化屬性。如何在構造函數中調用承諾對象以設置屬性

var getCookie = function(object, someParams) { 
    return connect(someParams) 
    .then(function(response){ 
     self.cookie = response.cookie;//this should be done as part of object initialization. 
     done(); 
    }); 
} 

var app = function(){ 
    var self = this; 
    getCookie(self); 
    //how to make sure that return happens after promise is resolved? 
    return self; 
} 

回答

3

如何確保收益情況承諾解決後?

你不行。在承諾解決之前,app函數將返回。這甚至可以通過JavaScript保證。

如何調用對象的承諾在構造函數中設置屬性

你不知道。

相反,您可以使用類似於工廠方法的方法創建類的新實例,並返回解析爲實例的promise。

實施例:

function getCookie(someParams) { 
return connect(someParams) 
    .then(function(response){ 
    return response.cookie; 
    }); 
} 

function App() {} 

function getApp() { 
    var app = new App(); 
    return getCookie(params) 
    .then(function (cookie) { 
     app.cookie = cookie; 
     return app; 
    }); 
} 

// Usage 

getApp().then(function(app) { 
    // use app 
}); 

One使用許諾爲異步過程。構造函數是同步的。雖然可以在構造函數中使用promise,但在解析promise之前,將不會完全初始化返回的實例。但是你的代碼永遠不會知道這是什麼時候。

這就是爲什麼有一個工廠方法返回一個承諾,如果更可靠的方式解析爲類實例。

+0

我試過這種方法,發生的事情是,應用程序正在返回沒有設置cookie。它在某段時間後被設置..我們如何確保它在完成承諾之前不會返回?我們是否必須添加承諾監視器?我明白,這聽起來更像是同步編程,但我只使用返回承諾 – learningtocode

+0

然後你沒有做我在我的答案建議。這是一個假的'connect'實現:https://jsfiddle.net/yqu5szLb/。 「*我們是否必須添加承諾監視器?」*否。承諾已經解決了這個問題。傳遞給'getApp()。然後(...)'的回調函數僅在* app.cookie = cookie後發生。 –

相關問題