2015-08-18 3 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 в первом фрагменте является частной функцией. Доступ к нему возможен только из кода внутри службы только

+0

Я использовал отладчик - вы были правы, не так много, чтобы продолжать так благодарить. Я не оценил, что неиспользуемый код не был вставлен в замыкающие обратные вызовы, но это имеет смысл. Благодарю. Также добавили $ inject непосредственно перед функцией - это то, что рекомендует руководство по стилю и более читаемо, поэтому, надеюсь, это не вызовет у меня никаких проблем. –

Смежные вопросы