2016-09-18 56 views
1

我有一個用例,其中一個Singleton對象具有異步步驟作爲其初始化的一部分。這個單例的其他公共方法依賴於初始化步驟設置的實例變量。我將如何去做一個異步調用同步?帶有異步初始化的單身人士

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

什麼是預期的'無功富= mySingleton.getInstance()getPrivateValue()'的結果? – guest271314

+0

這只是一個複雜的版本,你不能從一個異步方法返回,而男孩是否讓一些固有的簡單事情複雜化了。 – adeneo

回答

1

如果你真的想用一個IIFE創建有些單身式的方法,你仍然必須使用與異步調用的承諾或回調,並與他們合作,而不是試圖異步轉換爲同步

喜歡的東西

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