2015-08-18 105 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 - 这正是风格指南的建议,并且更具可读性,所以希望不会引起更多问题。 –