2014-02-22 150 views
1

我有一個工廠函數,它不會返回我想在控制器中設置的變量。雖然我沒有收到錯誤,但只是變量不會被設置爲它所設想的值。返回空對象的服務函數

spApp.factory('SiteService', function ($q){ 
    var rootUrl = window.location.protocol + "//" + window.location.hostname; 
    var siteMap; 

    //returns object containing info about all sites within collection 
    var getSiteMap = function() { 
     siteMap = {}; 

     var promise = $().SPServices({ 
      operation: "GetAllSubWebCollection", 
      async: true 
     }); 

     promise.then(
      function (response){ 
       map = {}; //init the map 
       var web = $(response).find("Web").map(function() { 
        return $(this).attr('Url'); 
       }); 
       var webTitle = $(response).find("Web").map(function() { 
        return $(this).attr('Title'); 
       }); 

       // create map 
       for (var i = 0; i < web.length; i++) { 
        var item = web[i], 
         title = webTitle[i], 
         parts = item.split('/'), 
         domain = parts.splice(0, 3).join('/'), 
         current; 

        if (!map[domain]) map[domain] = {url:domain, title:title ,children:{}}; 
        current = map[domain].children; 

        for (var index in parts) { 
         var part = parts[index]; 
         if (!current[part]) { 
          current[part] = {url:domain+'/'+parts.slice(0,index+1).join('/'), title:title, children:{}}; 
         } 
         current = current[part].children; 
        } 
       } 
      siteMap = map; 
     }, function(reason){ 
      alert('FAILED:' + reason); 
     }) 
     console.log(siteMap); 
     return siteMap; 
    } 

    return{ 
     getSiteMap:getSiteMap 
    } 
}); 
+0

它看起來像你檢查你的變量之前的承諾已得到解決。 –

+0

我試着在.then函數中放入返回值,但那也不起作用。 – Batman

回答

0

嘗試鏈接你的承諾是這樣的:

var getSiteMap = function() { 
    siteMap = {}; 

    var promise = $().SPServices({ 
     operation: "GetAllSubWebCollection", 
     async: true 
    }); 

    return promise.then(function(response){ //return your promise 
     // all you code 
     siteMap = map; 

     return siteMap; //return a value to another .then in the chain 
    }); 
} 

使用方法如下:

SiteService.getSiteMap().then(function(siteMap){ 

}); 
0

您遇到的問題是您正在使用承諾。當您將console.log放在then()函數之外時,您在之前記錄變量它實際上已被解決。

如果您將console.log放入您的then()函數(在分配站點地圖後),它應該顯示正確的值,但您仍然無法可靠地訪問它。

我想爲你後訪問siteMap價值已經填充了數據最簡單的方法是在一個回調函數來傳遞。例如:

var getSiteMap = function (_callback) { 
    siteMap = {}; 

    $().SPServices({ 
     operation: "GetAllSubWebCollection", 
     async: true 
    }).then(function(response){ 
     // Process the data and set siteMap 
     // ... 
     siteMap = map; 

     // now pass siteMap to the callback 
     _callback(siteMap); 
    }); 

你會那麼在你的控制器使用像這樣:

SiteService.getSiteMap(function(sitemap){ 
    // Do something with your sitemap here 
}); 

現在,雖然這會工作,它只是一個簡單的例子,而不一定是最好的方式。如果您不喜歡回叫,則可以創建第二個承諾,僅在分配siteMap時才能解決。同樣取決於您的使用案例getSiteMap(),您可能需要緩存該值,否則每次都會調用該請求。