angular 服务内的可变范围
variable scope within angular service
我有一个自定义服务,它依赖于另一个服务并且有一个外部 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,
};
然后我可以获得对这些变量的引用。这看起来很直观,但同时也很奇怪。谁能告诉我这是怎么回事?
您在函数本身内部提供 $inject
数组...这不是做事的正确方法。应该在调用函数之前提供
function layerQueryer($http,$q,overlayLayersConf){
....
}
layerQueryer.$inject = ['$http','$q','overlayLayersConf'];
after the three promises are fulfilled I no longer have a reference to the overlayLayersConf service passed into the service constructor
你是怎么发现的?提供的任何代码都不使用 overlayLayersConf
。这意味着它不会保存到闭包中,因此在调试器中 overlayLayersConf
将在所有子调用中未定义。
第一个片段中的 joinArrays
是私有函数。只能从服务内部的代码访问它
我有一个自定义服务,它依赖于另一个服务并且有一个外部 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,
};
然后我可以获得对这些变量的引用。这看起来很直观,但同时也很奇怪。谁能告诉我这是怎么回事?
您在函数本身内部提供 $inject
数组...这不是做事的正确方法。应该在调用函数之前提供
function layerQueryer($http,$q,overlayLayersConf){
....
}
layerQueryer.$inject = ['$http','$q','overlayLayersConf'];
after the three promises are fulfilled I no longer have a reference to the overlayLayersConf service passed into the service constructor
你是怎么发现的?提供的任何代码都不使用 overlayLayersConf
。这意味着它不会保存到闭包中,因此在调试器中 overlayLayersConf
将在所有子调用中未定义。
joinArrays
是私有函数。只能从服务内部的代码访问它