2016-09-18 6 views
1

シングルトンオブジェクトが初期化の一部として非同期ステップを持つユースケースがあります。このシングルトンの他のパブリックメソッドは、初期化ステップが設定するインスタンス変数に依存します。非同期呼び出しを同期させるにはどうすればいいですか?非同期初期化を伴うシングルトン

var mySingleton = (function() { 

    var instance; 

    function init() { 

    // Private methods and variables 
    function privateMethod(){ 
     console.log("I am private"); 
    } 

    var privateAsync = (function(){ 
     // async call which returns an object 
    })(); 

    return { 

     // Public methods and variables 

     publicMethod: function() { 
     console.log("The public can see me!"); 
     }, 

     publicProperty: "I am also public", 

     getPrivateValue: function() { 
     return privateAsync; 
     } 
    }; 
    }; 

    return { 

    // Get the Singleton instance if one exists 
    // or create one if it doesn't 
    getInstance: function() { 

     if (!instance) { 
     instance = init(); 
     } 

     return instance; 
    } 

    }; 

})(); 

var foo = mySingleton.getInstance().getPrivateValue(); 
+0

よう

何か 'どのように私は、非同期呼び出しの同期を行うに行くか、' - ?それはunpossibleだ –

+0

'VAR fooという= mySingleton.getInstance()getPrivateValue()'の結果を期待されて何? – guest271314

+0

これは、非同期メソッドから戻ることができない方法の複雑なバージョンです。少年は本質的に単純なものを複雑にしました。 – adeneo

答えて

1

あなたが本当にややシングルトンのようなアプローチを作成するために、生命維持を使用したい場合、あなたはまだ非同期呼び出しで約束やコールバックを使用する必要があり、そして彼らと仕事、同期

に非同期変換しようとしません
var mySingleton = (function() { 

    var instance; 

    function init() { 
    // Private methods and variables 
    function privateMethod() { 
     console.log("I am private"); 
    } 

    var privateAsync = new Promise(function(resolve, reject) { 
      // async call which returns an object 
     // resolve or reject based on result of async call here 
    }); 

    return { 
     // Public methods and variables 
     publicMethod: function() { 
     console.log("The public can see me!"); 
     }, 
     publicProperty: "I am also public", 
     getPrivateValue: function() { 
     return privateAsync; 
     } 
    }; 
    }; 

    return { 

    // Get the Singleton instance if one exists 
    // or create one if it doesn't 
    getInstance: function() { 

     if (!instance) { 
     instance = init(); 
     } 

     return instance; 
    } 

    }; 

})(); 

var foo = mySingleton.getInstance().getPrivateValue().then(function(result) { 
    // woohoo 
}).catch(function(err) { 
    // epic fail 
}) 
+0

私はこれを試し、別のアプローチを提案します上記のコメントで。 – johnborges

関連する問題