2016-10-03 6 views
1

私はjavascriptを初めて使うので、私は約束(ブルーバードを使用)を使用する方法を理解する助けが必要です。私のコードは以下の通りで、プロパティが解決された後にコンストラクタでプロパティを初期化する必要があります。プロパティを設定するためにコンストラクタでpromiseオブジェクトを呼び出す方法

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でも保証されています。あなたがいない

プロパティを設定するためにコンストラクタで約束オブジェクトを呼び出す方法

代わりに、クラスの新しいインスタンスを作成するファクトリメソッドのようなものがあり、そのインスタンスに解決する約束を返します。

例:

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

一つは非同期プロセスのための約束を使用しています。コンストラクタ関数は同期しています。プロビジョニングをコンストラクタで使用することはできますが、返されたインスタンスは、プロビジョニングが解決されるまで完全に初期化されません。しかし、あなたのコードはそれがいつあるか決して分かりません。

これは、より信頼性の高い方法でクラスインスタンスに解決する約束を返すファクトリメソッドを持つ理由です。

+0

私はこのアプローチを試みましたが、何が起こっているのは、クッキーが設定されていない状態でアプリケーションが返されていることです。それはいつか後に設定されます..それは約束を完了する前にそれが戻っていないことを確認するか?約束のモニターを追加する必要がありますか?私はこれが同期プログラミングのように聞こえると理解していますが、私が使用するapiは約束を返すだけです – learningtocode

+0

あなたは私の答えで何を提案していません。以下は、偽の 'connect'実装を実装したものです:https://jsfiddle.net/yqu5szLb/。 「*約束のモニターを追加する必要がありますか?」いいえ、約束はすでにその問題を解決しています。 'getApp()。then(...)'に渡されるコールバックは、 'app.cookie = cookie;'の後にのみ実行されます。 –

関連する問題