繁体   English   中英

角度服务中的可变范围

[英]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'];

在实现三个承诺之后,我不再引用传递给服务构造函数的overlayLayersConf服务

你怎么发现的? 所提供的任何代码均不使用overlayLayersConf 这意味着它不会保存到闭包中,因此在调试器中overlayLayersConf将在所有子调用中未定义。

第一个代码段中的joinArrays是一个私有函数。 只能从服务内部的代码中访问它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM