2015-08-18 161 views
0

我有一個自定義服務,它具有對另一個服務的依賴並具有外部API和一些內部函數。角度服務中的變量範圍

angular.module('DashboardApp').factory('layerQueryer', layerQueryer); 

function layerQueryer($http, $q, overlayLayersConf) { 
    layerQueryer.$inject = ['$http', '$q', 'overlayLayersConf']; 

    function joinArrays(array1, array2, keya, keyb) { 
      ..... 
    }; 

    function getLayerList() { 
     var def = $q.defer(); 
     var Promise1 = dosomething(); 
     var Promise2 = dosomethingelse(); 
     var Promise3 = doanotherthing(); 
     $q.all([Promise1, Promise2, Promise3]) 
      .then(function (data) { 
       def.resolve('xxxx'); 
      }) 
      . 
     catch (function (error) { 
      console.log(error); 
     }) 
     return def.promise; 
    }; 
    return { 
     getLayerList: getLayerList, 
    }; 
} 

我有兩個問題與此服務 - 一個回調執行時後三個履行諾言我不再需要傳遞到服務的構造函數,這是我需要的overlayLayersConf服務的引用,我也做當我需要在同一時間使用它時,沒有參考joinArrays。

我發現,如果我把JoinArrays功能到一個變量,使額外的兩個功能和揭發他們:

function getJoinArray(){ 
    return joinArrays; 
} 

// for some reason this seems to allow the scope to be kept during the promise callback... 
function getOverlayLayers(){ 
    return overlayLayersConf; 
} 

return { 
    getJoinArray:getJoinArray, 
    getLayerList: getLayerList, 
    getOverlayLayers: getOverlayLayers, 
}; 

然後,我可以得到這些變量的引用。這看起來很直觀但同時也很奇怪。誰能告訴我這裏發生了什麼?

回答

1

你在函數本身內部提供了$inject數組......這不是正確的做事方式。應該函數被調用之前提供

function layerQueryer($http,$q,overlayLayersConf){ 
.... 
} 
layerQueryer.$inject = ['$http','$q','overlayLayersConf']; 

後三個履行諾言我不再需要傳遞到服務構造的overlayLayersConf服務的引用

你如何找到了這一點?所提供的任何代碼不使用overlayLayersConf。這意味着它不會被保存到關閉狀態,因此調試程序overlayLayersConf將在所有子呼叫內都未定義。

joinArrays in first snippet is a private function。它只能從服務內部的代碼訪問只有

+0

我正在使用調試器 - 你是對的沒有太多的繼續,所以謝謝。我沒有意識到未使用的代碼沒有被插入到閉包回調中,但它是有道理的。謝謝。在函數之前也放入了$ inject - 這正是風格指南的建議,並且更具可讀性,所以希望不會引起更多問題。 –